<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2988995652194087219</id><updated>2026-06-06T19:27:06.242+07:00</updated><category term="Blackberry"/><category term="iPhone"/><category term="Jailbreak"/><category term="Laravel"/><category term="iPad"/><category term="Tutorial"/><category term="Pemrograman"/><category term="PS2"/><category term="Others"/><category term="PHP"/><category term="CodeIgniter"/><category term="Cydia"/><category term="Big Data"/><category term="GIS"/><category term="Hadoop"/><category term="Mac OS"/><category term="OAuth2"/><category term="Security"/><category term="AI SDK"/><category term="API"/><category term="About Me"/><category term="Ajax"/><category term="Android"/><category term="ArcView"/><category term="Filament PHP"/><category term="Filament dashboard"/><category term="Filament tutorial"/><category term="Hive"/><category term="JWT"/><category term="JavaScript"/><category term="Kotlin"/><category term="Laravel 2025"/><category term="Laravel CMS"/><category term="Laravel CRUD generator"/><category term="Laravel Filament"/><category term="Laravel admin panel"/><category term="Linux"/><category term="Objective-C"/><category term="Retrofit"/><title type='text'>Dityalovers</title><subtitle type='html'>Personal blog about Web Programming, Blackberry, iOS Devices, iOS Application Development and Geographic Information System, Tips and Tricks</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Aditya Nursyahbani</name><uri>http://www.blogger.com/profile/07325213218049741746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTpoUrcVoSJHVanvhqCggtaov04yK6-3r_c3wRwWTa-ADRHKl5ZdFyYM_VXKVHST3BoEN5oUFsAjIXk9x_YbKEcc4eBdbd4JuWjCvPsWiZqs7NDDi9oXLU-mdIWFfTw/s220/SAM_1082.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>66</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-8516594262686051313</id><published>2026-05-23T19:55:44.918+07:00</published><updated>2026-05-23T19:55:44.918+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JWT"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><category scheme="http://www.blogger.com/atom/ns#" term="OAuth2"/><title type='text'>OAuth2 and JWT Authentication in Laravel in 2026</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwY555WJqrVJ5w_XIZ10cnQtavYkRh8FJcYlmpwDFqtvs0emkRf8bjSS3hWsFKRYtTaHYM2CK6vByZErhaVxEcA7upMu3ohFomVhbLSm9sejFOdQSTt60Zvkv5WJIPbqugzXEf-OTr5POV1P0CqiVWjDWdrNmbVm_Ysi0PCtKJqrSRy0WA9qT8lk0AZw/s1536/ChatGPT%20Image%20May%2023,%202026,%2007_54_24%20PM%20(1).png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;OAuth2 and JWT&quot; border=&quot;0&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1536&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwY555WJqrVJ5w_XIZ10cnQtavYkRh8FJcYlmpwDFqtvs0emkRf8bjSS3hWsFKRYtTaHYM2CK6vByZErhaVxEcA7upMu3ohFomVhbLSm9sejFOdQSTt60Zvkv5WJIPbqugzXEf-OTr5POV1P0CqiVWjDWdrNmbVm_Ysi0PCtKJqrSRy0WA9qT8lk0AZw/w320-h213/ChatGPT%20Image%20May%2023,%202026,%2007_54_24%20PM%20(1).png&quot; title=&quot;OAuth2 and JWT Authentication in Laravel in 2026&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Authentication architecture has evolved significantly in modern Laravel applications.&lt;/p&gt;&lt;p&gt;Today’s systems must support:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;mobile applications&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SPAs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;microservices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;AI platforms&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;third-party integrations&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;enterprise APIs&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Simple session authentication is no longer enough for distributed applications.&lt;/p&gt;&lt;p&gt;In 2026, most scalable Laravel systems rely on:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;OAuth2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;JWT authentication&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;token-based authorization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;zero trust identity systems&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This guide explains how OAuth2 and JWT work in Laravel, their differences, and production-grade implementation strategies.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Understanding OAuth2 vs JWT&lt;/h1&gt;&lt;p&gt;Many developers confuse OAuth2 and JWT.&lt;/p&gt;&lt;p&gt;They solve different problems.&lt;/p&gt;&lt;h2&gt;OAuth2&lt;/h2&gt;&lt;p&gt;OAuth2 is:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;an authorization framework.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;It defines:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;how clients obtain access&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;token issuance flows&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;delegated authorization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;permission scopes&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;OAuth2 is commonly used for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;third-party login&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;API access delegation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;enterprise integrations&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;JWT&lt;/h2&gt;&lt;p&gt;JWT (JSON Web Token) is:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;a token format.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;It contains encoded claims such as:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;user identity&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;expiration&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;permissions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;issuer&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;JWT is commonly used for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;stateless authentication&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;APIs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;microservices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;distributed systems&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;OAuth2 Flow Overview&lt;/h1&gt;&lt;p&gt;OAuth2 authorization flow:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;User authenticates&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Authorization server issues token&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Client stores token&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;API validates token&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Access granted&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This enables:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;delegated access&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;fine-grained permissions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;token expiration&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;revocation systems&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;JWT Authentication Flow&lt;/h1&gt;&lt;p&gt;JWT authentication works differently.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;User logs in&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Server generates JWT&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Client stores token&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Client sends token on requests&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;API validates signature&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;JWT removes server-side session dependency.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Choosing Between Sanctum, Passport, and JWT&lt;/h1&gt;&lt;p&gt;Laravel provides multiple authentication options.&lt;/p&gt;&lt;h2&gt;Laravel Sanctum&lt;/h2&gt;&lt;p&gt;Best for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;SPAs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;first-party apps&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;lightweight APIs&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Advantages:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;simple&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;secure&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;minimal complexity&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Laravel Passport&lt;/h2&gt;&lt;p&gt;Best for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;OAuth2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;enterprise integrations&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;third-party access&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;delegated authorization&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Passport implements full OAuth2 server functionality.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;JWT Authentication&lt;/h2&gt;&lt;p&gt;Best for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;stateless APIs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;microservices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;distributed systems&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;external auth providers&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Common package:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;tymon/jwt-auth&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Installing Laravel Passport&lt;/h1&gt;&lt;p&gt;Install Passport:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;bash id=&amp;quot;e13i0n&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;bash id=&amp;quot;e13i0n&amp;quot;&quot;&gt;composer require laravel/passport&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run migrations:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;bash id=&amp;quot;p2gz4j&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;bash id=&amp;quot;p2gz4j&amp;quot;&quot;&gt;php artisan migrate&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Install encryption keys:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;bash id=&amp;quot;u1l26w&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;bash id=&amp;quot;u1l26w&amp;quot;&quot;&gt;php artisan passport:install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enable Passport:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php id=&amp;quot;j9wn0l&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php id=&amp;quot;j9wn0l&amp;quot;&quot;&gt;use Laravel\Passport\Passport;

public function boot(): void
{
    Passport::routes();
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Configuring API Authentication&lt;/h1&gt;&lt;p&gt;In &lt;code data-backticks=&quot;1&quot;&gt;config/auth.php&lt;/code&gt;:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php id=&amp;quot;jlwm0l&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php id=&amp;quot;jlwm0l&amp;quot;&quot;&gt;&#39;guards&#39; =&amp;gt; [
    &#39;api&#39; =&amp;gt; [
        &#39;driver&#39; =&amp;gt; &#39;passport&#39;,
        &#39;provider&#39; =&amp;gt; &#39;users&#39;,
    ],
],&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Creating Access Tokens&lt;/h1&gt;&lt;p&gt;Example:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php id=&amp;quot;x0smyf&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php id=&amp;quot;x0smyf&amp;quot;&quot;&gt;$token = $user-&amp;gt;createToken(
    &#39;mobile-app&#39;,
    [&#39;orders:read&#39;]
);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OAuth2 scopes provide granular permission control.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;JWT Authentication Setup&lt;/h1&gt;&lt;p&gt;Install JWT package:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;bash id=&amp;quot;4h1h9v&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;bash id=&amp;quot;4h1h9v&amp;quot;&quot;&gt;composer require tymon/jwt-auth&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Publish configuration:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;bash id=&amp;quot;f5p9y4&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;bash id=&amp;quot;f5p9y4&amp;quot;&quot;&gt;php artisan vendor:publish \
--provider=&quot;Tymon\JWTAuth\Providers\LaravelServiceProvider&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Generate secret key:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;bash id=&amp;quot;0x8v2e&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;bash id=&amp;quot;0x8v2e&amp;quot;&quot;&gt;php artisan jwt:secret&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Generating JWT Tokens&lt;/h1&gt;&lt;p&gt;Example login controller:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php id=&amp;quot;i6k4l7&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php id=&amp;quot;i6k4l7&amp;quot;&quot;&gt;public function login(Request $request)
{
    $credentials = $request-&amp;gt;only(
        &#39;email&#39;,
        &#39;password&#39;
    );

    if (! $token = auth()-&amp;gt;attempt($credentials)) {
        return response()-&amp;gt;json([
            &#39;error&#39; =&amp;gt; &#39;Unauthorized&#39;
        ], 401);
    }

    return response()-&amp;gt;json([
        &#39;token&#39; =&amp;gt; $token
    ]);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Protecting Routes&lt;/h1&gt;&lt;p&gt;JWT middleware example:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php id=&amp;quot;d4mx0n&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php id=&amp;quot;d4mx0n&amp;quot;&quot;&gt;Route::middleware(&#39;auth:api&#39;)-&amp;gt;group(function () {
    //
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Use Refresh Tokens&lt;/h1&gt;&lt;p&gt;Never issue permanent tokens.&lt;/p&gt;&lt;p&gt;Modern authentication should use:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;short-lived access tokens&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;refresh tokens&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;automatic rotation&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Benefits:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;reduced compromise window&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;safer mobile authentication&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;improved revocation handling&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Implement Token Rotation&lt;/h1&gt;&lt;p&gt;Production systems should rotate:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;access tokens&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;signing keys&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;refresh tokens&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Token rotation limits long-term abuse after leaks.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Use Scoped Permissions&lt;/h1&gt;&lt;p&gt;Never allow unrestricted API access.&lt;/p&gt;&lt;p&gt;Bad:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php id=&amp;quot;wmt4h2&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php id=&amp;quot;wmt4h2&amp;quot;&quot;&gt;[&#39;*&#39;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Better:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php id=&amp;quot;2db00v&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php id=&amp;quot;2db00v&amp;quot;&quot;&gt;[
    &#39;orders:read&#39;,
    &#39;orders:create&#39;,
]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Principle:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;least privilege access.&lt;/p&gt;&lt;/blockquote&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Secure Token Storage&lt;/h1&gt;&lt;p&gt;Frontend security matters.&lt;/p&gt;&lt;p&gt;Never:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;store tokens in localStorage for sensitive systems&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;expose refresh tokens to JavaScript unnecessarily&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Safer approaches:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;HTTP-only cookies&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;secure cookies&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;encrypted storage&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Enable MFA for Sensitive Systems&lt;/h1&gt;&lt;p&gt;Authentication alone is insufficient.&lt;/p&gt;&lt;p&gt;Add:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;OTP verification&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;WebAuthn&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;hardware keys&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;device approval flows&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Critical for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;fintech&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;enterprise SaaS&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;admin dashboards&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Prevent Token Theft&lt;/h1&gt;&lt;p&gt;Protect against:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;XSS attacks&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;token replay&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;MITM interception&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Recommended:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;HTTPS everywhere&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;CSP headers&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;device fingerprinting&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;token expiration&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Revoke Compromised Tokens&lt;/h1&gt;&lt;p&gt;Modern auth systems must support revocation.&lt;/p&gt;&lt;p&gt;Examples:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;suspicious IP access&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;credential leaks&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;logout events&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;password resets&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Passport supports token revocation directly.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Use API Rate Limiting&lt;/h1&gt;&lt;p&gt;Authentication endpoints are high-risk attack surfaces.&lt;/p&gt;&lt;p&gt;Protect:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;login routes&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;token refresh endpoints&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;password reset APIs&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Laravel example:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php id=&amp;quot;9jv0hz&amp;quot;&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php id=&amp;quot;9jv0hz&amp;quot;&quot;&gt;RateLimiter::for(&#39;login&#39;, function (Request $request) {
    return Limit::perMinute(5)
        -&amp;gt;by($request-&amp;gt;ip());
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Secure Microservice Authentication&lt;/h1&gt;&lt;p&gt;For microservices:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;avoid shared secrets&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;use short-lived JWTs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;implement mutual TLS&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;isolate internal APIs&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Zero trust networking is increasingly important.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Monitor Authentication Activity&lt;/h1&gt;&lt;p&gt;Track:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;failed logins&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;abnormal token issuance&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;suspicious devices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;geographic anomalies&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Useful tools:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Laravel Pulse&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;OpenTelemetry&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Grafana&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SIEM systems&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;OAuth2 Security Best Practices&lt;/h1&gt;&lt;p&gt;Production OAuth2 systems should:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;enforce HTTPS&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;rotate secrets&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;restrict redirect URLs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;validate scopes&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;use PKCE flows&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;PKCE is especially important for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;mobile apps&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;public clients&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SPAs&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;JWT Security Best Practices&lt;/h1&gt;&lt;p&gt;JWT systems should:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;use strong signing keys&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;keep expiration short&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;rotate tokens&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;validate issuer/audience&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;avoid sensitive payload data&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Never store confidential data directly inside JWT payloads.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;OAuth2 vs JWT Comparison&lt;/h1&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;p&gt;Feature&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;OAuth2&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;JWT&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Purpose&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Authorization framework&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Token format&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Session Storage&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Optional&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Stateless&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Third-party Access&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Excellent&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Limited&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Complexity&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Higher&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Simpler&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Microservices&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Good&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Excellent&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Enterprise Integrations&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Excellent&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Moderate&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Token Revocation&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Easier&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Harder&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Recommended Architecture in 2026&lt;/h1&gt;&lt;h2&gt;Use Sanctum When:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;building SPAs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;handling first-party APIs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;simplicity matters&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Use Passport When:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;implementing OAuth2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;supporting third-party integrations&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;enterprise authorization is needed&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Use JWT When:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;building distributed systems&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;scaling microservices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;requiring stateless authentication&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Production Authentication Checklist&lt;/h1&gt;&lt;p&gt;Before deploying Laravel authentication systems:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;HTTPS enforced&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;MFA enabled&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Refresh tokens implemented&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Token scopes configured&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Expiration policies active&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Rate limiting enabled&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Token rotation enabled&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Logging centralized&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Revocation supported&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;PKCE enabled&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;CSP headers configured&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Monitoring enabled&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Conclusion&lt;/h1&gt;&lt;p&gt;Modern Laravel authentication is no longer just about login forms.&lt;/p&gt;&lt;p&gt;Production-grade systems require:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;secure token management&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;delegated authorization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;layered defenses&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;observable authentication flows&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;zero trust principles&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;OAuth2 and JWT are both powerful tools.&lt;/p&gt;&lt;p&gt;The best choice depends on:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;architecture&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;scalability requirements&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;third-party integrations&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;security posture&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Authentication is now part of infrastructure architecture itself.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Related Article:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://dityalovers.blogspot.com/2016/10/tutorial-oauth2-dengan-codeigniter.html&quot; target=&quot;_blank&quot;&gt;Tutorial OAuth2 dengan CodeIgniter&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/8516594262686051313/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2026/05/oauth2-and-jwt-authentication-in.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/8516594262686051313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/8516594262686051313'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2026/05/oauth2-and-jwt-authentication-in.html' title='OAuth2 and JWT Authentication in Laravel in 2026'/><author><name>dityalovers</name><uri>http://www.blogger.com/profile/15543044829406906904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwY555WJqrVJ5w_XIZ10cnQtavYkRh8FJcYlmpwDFqtvs0emkRf8bjSS3hWsFKRYtTaHYM2CK6vByZErhaVxEcA7upMu3ohFomVhbLSm9sejFOdQSTt60Zvkv5WJIPbqugzXEf-OTr5POV1P0CqiVWjDWdrNmbVm_Ysi0PCtKJqrSRy0WA9qT8lk0AZw/s72-w320-h213-c/ChatGPT%20Image%20May%2023,%202026,%2007_54_24%20PM%20(1).png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-2274504548819629144</id><published>2026-05-23T19:42:16.243+07:00</published><updated>2026-05-23T19:42:16.243+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><category scheme="http://www.blogger.com/atom/ns#" term="Security"/><title type='text'>Laravel API Security Best Practices in 2026</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_n-Re_CCW4NDyqArck3ZqxSrYc5kxEk1ss-FlshUdva38U5oO591wx1EdnQ99T7oeD1qyUn3hSoBGiHx-QHNOAlQDOL2DBmKpFfPT9Ips-gpmsv_S2nj83zgoLlcuf_8NAK8Nc9WVqOvGMR-wD5xbtJ3uD4K53au3FKpgY3p_AMn4Z2YW4pzbrt3XrA/s1536/ChatGPT%20Image%20May%2023,%202026,%2007_40_49%20PM%20(1).png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Laravel API Security Best Practices in 2026&quot; border=&quot;0&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1536&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_n-Re_CCW4NDyqArck3ZqxSrYc5kxEk1ss-FlshUdva38U5oO591wx1EdnQ99T7oeD1qyUn3hSoBGiHx-QHNOAlQDOL2DBmKpFfPT9Ips-gpmsv_S2nj83zgoLlcuf_8NAK8Nc9WVqOvGMR-wD5xbtJ3uD4K53au3FKpgY3p_AMn4Z2YW4pzbrt3XrA/w320-h213/ChatGPT%20Image%20May%2023,%202026,%2007_40_49%20PM%20(1).png&quot; title=&quot;Laravel API Security Best Practices in 2026&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;APIs have become the backbone of modern Laravel applications.&lt;/div&gt;&lt;p&gt;From:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;mobile apps&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;AI services&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SaaS platforms&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;fintech systems&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;microservices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;third-party integrations&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Almost every modern Laravel architecture depends heavily on APIs.&lt;/p&gt;&lt;p&gt;This also means APIs are one of the biggest attack surfaces in production systems.&lt;/p&gt;&lt;p&gt;In 2026, securing Laravel APIs requires more than authentication middleware.&lt;/p&gt;&lt;p&gt;Modern API security involves:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;identity verification&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;request integrity&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;infrastructure isolation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;abuse prevention&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;observability&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;zero trust networking&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This guide covers production-grade Laravel API security strategies used in scalable systems.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;1. Always Use HTTPS&lt;/h1&gt;&lt;p&gt;APIs should never be exposed over plain HTTP.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Without HTTPS:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;tokens can be intercepted&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;credentials leak&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;session hijacking becomes possible&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Force HTTPS in production.&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;use Illuminate\Support\Facades\URL;

public function boot(): void
{
    if (app()-&amp;gt;environment(&#39;production&#39;)) {
        URL::forceScheme(&#39;https&#39;);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Also enable HSTS:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;nginx&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;nginx&quot;&gt;add_header Strict-Transport-Security &quot;max-age=31536000&quot; always;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;2. Use Token-Based Authentication Properly&lt;/h1&gt;&lt;p&gt;For modern Laravel APIs, recommended authentication methods include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Laravel Sanctum&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;OAuth2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;JWT&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;WebAuthn-backed flows&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For first-party SPAs:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Sanctum is usually the best option&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For third-party integrations:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;OAuth2 is safer and more scalable&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Avoid:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;long-lived static API keys&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;shared credentials&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;plaintext token storage&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;3. Scope API Permissions&lt;/h1&gt;&lt;p&gt;Never give APIs unlimited access.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Bad:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;$user-&amp;gt;createToken(&#39;api-token&#39;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Better:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;$user-&amp;gt;createToken(
    &#39;mobile-app&#39;,
    [&#39;orders:read&#39;, &#39;orders:create&#39;]
);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Scoped permissions reduce blast radius during compromise.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;4. Implement Rate Limiting&lt;/h1&gt;&lt;p&gt;Rate limiting protects APIs against:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;brute force attacks&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;credential stuffing&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;scraping&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;denial-of-service abuse&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Laravel example:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;RateLimiter::for(&#39;api&#39;, function (Request $request) {
    return Limit::perMinute(60)-&amp;gt;by(
        $request-&amp;gt;user()?-&amp;gt;id ?: $request-&amp;gt;ip()
    );
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For sensitive endpoints:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;Limit::perMinute(5)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;5. Validate Every Request&lt;/h1&gt;&lt;p&gt;Never trust client input.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Always validate:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;payload structure&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;types&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;enums&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;file uploads&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;nested objects&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Example:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;$request-&amp;gt;validate([
    &#39;email&#39; =&amp;gt; [&#39;required&#39;, &#39;email&#39;],
    &#39;role&#39; =&amp;gt; [&#39;in:user,admin&#39;],
]);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use Form Requests for cleaner security architecture.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;6. Prevent Mass Assignment Vulnerabilities&lt;/h1&gt;&lt;p&gt;Mass assignment attacks still affect many APIs.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Bad:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;User::create($request-&amp;gt;all());&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Safer:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;User::create(
    $request-&amp;gt;validated()
);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And use explicit fillable fields:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;protected $fillable = [
    &#39;name&#39;,
    &#39;email&#39;,
];&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;7. Add API Request Logging&lt;/h1&gt;&lt;p&gt;Security incidents are impossible to investigate without logs.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Log:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;failed logins&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;permission denials&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;token creation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;suspicious IPs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;abnormal traffic spikes&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Useful stack:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Laravel Pulse&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;OpenTelemetry&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Grafana&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Loki&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;8. Rotate API Tokens Regularly&lt;/h1&gt;&lt;p&gt;Never allow permanent API tokens.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Recommended:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;short-lived access tokens&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;refresh tokens&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;automated rotation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;revocation support&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For high-security systems:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;revoke tokens after suspicious behavior&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;bind tokens to devices/IPs&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;9. Use Signed Requests for Sensitive Operations&lt;/h1&gt;&lt;p&gt;Critical operations should verify request integrity.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Examples:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;payment callbacks&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;webhook endpoints&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;internal service communication&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Laravel signed URLs:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;URL::signedRoute(&#39;download&#39;, [
    &#39;file&#39; =&amp;gt; $id
]);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For APIs:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;HMAC signatures&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;timestamp verification&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;nonce validation&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;10. Protect Against Enumeration Attacks&lt;/h1&gt;&lt;p&gt;Avoid exposing:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;whether emails exist&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;user IDs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;internal references&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Bad:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;json&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;json&quot;&gt;{
  &quot;message&quot;: &quot;Email not found&quot;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Safer:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;json&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;json&quot;&gt;{
  &quot;message&quot;: &quot;Invalid credentials&quot;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;11. Use API Versioning&lt;/h1&gt;&lt;p&gt;Versioning improves:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;security upgrades&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;deprecation management&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;client isolation&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Example:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;Route::prefix(&#39;v1&#39;)-&amp;gt;group(function () {
    //
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This prevents breaking older integrations during security changes.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;12. Secure File Upload APIs&lt;/h1&gt;&lt;p&gt;File upload endpoints are high-risk attack vectors.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Always:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;validate MIME types&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;limit file size&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;randomize filenames&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;scan uploads&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;store outside public directories&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Example:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;$request-&amp;gt;validate([
    &#39;document&#39; =&amp;gt; [
        &#39;required&#39;,
        &#39;file&#39;,
        &#39;mimes:pdf,png,jpg&#39;,
        &#39;max:2048&#39;,
    ]
]);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;13. Use Security Headers&lt;/h1&gt;&lt;p&gt;APIs should include protective headers.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Important headers:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;X-Content-Type-Options&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Referrer-Policy&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Content-Security-Policy&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;X-Frame-Options&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Example middleware:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;$response-&amp;gt;headers-&amp;gt;set(
    &#39;X-Frame-Options&#39;,
    &#39;DENY&#39;
);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;14. Protect Against CORS Misconfiguration&lt;/h1&gt;&lt;p&gt;Bad CORS policies expose APIs to abuse.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Avoid:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;&#39;allowed_origins&#39; =&amp;gt; [&#39;*&#39;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Instead:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;&#39;allowed_origins&#39; =&amp;gt; [
    &#39;https://app.example.com&#39;
]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Misconfigured CORS is still one of the most common API vulnerabilities.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;15. Isolate Internal APIs&lt;/h1&gt;&lt;p&gt;Internal APIs should never be public.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Protect internal services using:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;VPN&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;private networking&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;API gateways&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;service mesh&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;mutual TLS&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In Kubernetes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;use NetworkPolicies&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;isolate namespaces&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;disable public exposure&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;16. Prevent SQL Injection&lt;/h1&gt;&lt;p&gt;Laravel query builder already helps prevent injection attacks.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Safe:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;User::where(&#39;email&#39;, $email)-&amp;gt;first();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dangerous:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;php&quot;&gt;&lt;pre&gt;&lt;code data-language=&quot;php&quot;&gt;DB::statement(
    &quot;SELECT * FROM users WHERE email = &#39;$email&#39;&quot;
);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Never concatenate raw SQL from user input.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;17. Secure Webhooks&lt;/h1&gt;&lt;p&gt;Webhook endpoints should verify:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;signatures&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;timestamps&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;replay protection&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Never trust incoming webhook payloads automatically.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Recommended:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;HMAC verification&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;request expiration windows&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;idempotency checks&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;18. Add Bot &amp;amp; WAF Protection&lt;/h1&gt;&lt;p&gt;Production APIs should use:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Cloudflare WAF&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;bot filtering&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;IP reputation systems&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;geo restrictions&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This reduces:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;scraping&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;automated attacks&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;malicious crawlers&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;19. Monitor API Abuse in Real Time&lt;/h1&gt;&lt;p&gt;Modern security requires observability.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Monitor:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;sudden request spikes&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;failed authentication bursts&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;unusual token activity&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;abnormal geographic access&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Useful metrics:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;requests per second&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;error rates&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;latency spikes&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;token issuance frequency&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;20. Adopt Zero Trust Security&lt;/h1&gt;&lt;p&gt;Modern API security assumes:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;no request is trusted automatically.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Every request should verify:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;identity&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;permissions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;integrity&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;device context&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;risk signals&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Zero trust becomes essential in:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;microservices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;multi-tenant SaaS&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;distributed systems&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Production Laravel API Security Checklist&lt;/h1&gt;&lt;p&gt;Before deploying production APIs:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;HTTPS enforced&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Authentication hardened&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Rate limiting enabled&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Token scopes configured&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Input validation active&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;API logs centralized&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tokens rotated regularly&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Security headers configured&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;CORS restricted&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;File uploads sandboxed&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Webhooks verified&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SQL injection protections reviewed&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Internal APIs isolated&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Monitoring enabled&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;WAF configured&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Conclusion&lt;/h1&gt;&lt;p&gt;Laravel provides an excellent foundation for building secure APIs.&lt;/p&gt;&lt;p&gt;But modern API security requires:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;layered defenses&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;infrastructure awareness&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;observability&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;strict access control&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;zero trust principles&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The most secure Laravel APIs are designed assuming:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;attackers will probe endpoints&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;credentials may leak&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;infrastructure may fail&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;abuse attempts are continuous&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Security is not middleware alone.&lt;/p&gt;&lt;p&gt;It is part of the entire API architecture.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/2274504548819629144/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2026/05/laravel-api-security-best-practices-in.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/2274504548819629144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/2274504548819629144'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2026/05/laravel-api-security-best-practices-in.html' title='Laravel API Security Best Practices in 2026'/><author><name>dityalovers</name><uri>http://www.blogger.com/profile/15543044829406906904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_n-Re_CCW4NDyqArck3ZqxSrYc5kxEk1ss-FlshUdva38U5oO591wx1EdnQ99T7oeD1qyUn3hSoBGiHx-QHNOAlQDOL2DBmKpFfPT9Ips-gpmsv_S2nj83zgoLlcuf_8NAK8Nc9WVqOvGMR-wD5xbtJ3uD4K53au3FKpgY3p_AMn4Z2YW4pzbrt3XrA/s72-w320-h213-c/ChatGPT%20Image%20May%2023,%202026,%2007_40_49%20PM%20(1).png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-3634607766379985408</id><published>2026-05-23T19:15:45.223+07:00</published><updated>2026-05-23T19:15:45.224+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><category scheme="http://www.blogger.com/atom/ns#" term="Security"/><title type='text'>Laravel Security Hardening in 2026: Production-Grade Security Checklist for Modern Laravel Applications</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span class=&quot;image-link&quot; contenteditable=&quot;false&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Laravel Security Hardening&quot; data-iml=&quot;601358.3999999994&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFJ8pr0Z5QupoctBQgOc9XjoAD0Fcg0x3MLgL7wr71h6EhPu9GajUrs_H5BZAl9hcC5i_jh71c3MUBo5DRcrWFiO0cFuNIuUMdF2i4iBkBBzKSnfpp5jgJgd-M0xTIzq8VVKRyoadjO8cEN0mEHr9AfL-05mE-qbmlx_CLyHpN8XIViZnXe6KdHTkhCA/w320-h213/ChatGPT%20Image%20May%2023,%202026,%2007_08_14%20PM.png&quot; title=&quot;Laravel Security Hardening in 2026: Production-Grade Security Checklist for Modern Laravel Applications&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Modern Laravel applications are no longer simple CRUD systems running on shared hosting. Today’s Laravel ecosystems power fintech platforms, enterprise dashboards, AI services, SaaS applications, internal government systems, and large-scale APIs. As infrastructure complexity increases, security can no longer rely only on validation rules and CSRF protection.&lt;/p&gt;&lt;p&gt;Laravel 2026 applications must be hardened across:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Application layer&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;API layer&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Infrastructure layer&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Database layer&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Queue &amp;amp; worker isolation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Cloud networking&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Authentication systems&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Deployment pipelines&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This guide covers practical Laravel security hardening strategies used in real production systems.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;1. Enforce HTTPS Everywhere&lt;/h1&gt;&lt;p&gt;The first security baseline is mandatory HTTPS.&lt;/p&gt;&lt;p&gt;Never allow:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;mixed content&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;insecure cookies&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;HTTP fallback routes&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Force HTTPS inside &lt;code&gt;AppServiceProvider&lt;/code&gt;.&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;use Illuminate\Support\Facades\URL;

public function boot(): void
{
    if (app()-&amp;gt;environment(&#39;production&#39;)) {
        URL::forceScheme(&#39;https&#39;);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Also configure:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;HSTS headers&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Secure cookies&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Reverse proxy trust&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For Nginx:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;add_header Strict-Transport-Security &quot;max-age=31536000&quot; always;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;2. Harden Authentication Systems&lt;/h1&gt;&lt;p&gt;Modern authentication should include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;MFA / 2FA&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Device tracking&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Session invalidation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Passwordless login&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Risk-based authentication&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Rate limiting&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Laravel starter kits are only the beginning.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Recommended stack:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Laravel Sanctum&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;WebAuthn&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;OTP verification&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Session fingerprinting&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Example login throttling:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;RateLimiter::for(&#39;login&#39;, function (Request $request) {
    return Limit::perMinute(5)-&amp;gt;by(
        $request-&amp;gt;ip()
    );
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;3. Use Strict Authorization Policies&lt;/h1&gt;&lt;p&gt;Authentication checks identity.&lt;/p&gt;&lt;p&gt;Authorization checks permissions.&lt;/p&gt;&lt;p&gt;Never rely on frontend role checks.&lt;/p&gt;&lt;p&gt;Bad:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;if ($user-&amp;gt;role === &#39;admin&#39;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Better:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;Gate::authorize(&#39;update&#39;, $project);Or policy-based authorization:&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;public function update(User $user, Project $project): bool
{
    return $user-&amp;gt;id === $project-&amp;gt;owner_id;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;4. Protect APIs Against Abuse&lt;/h1&gt;&lt;p&gt;Public APIs are constant attack targets.&lt;/p&gt;&lt;p&gt;Add:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;rate limiting&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;API scopes&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;IP reputation filtering&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;request signing&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;bot protection&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Example API throttling:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;Route::middleware(&#39;throttle:api&#39;)-&amp;gt;group(function () {
    //
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Advanced production systems use:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Cloudflare WAF&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;API gateways&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;token rotation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;geo restrictions&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;5. Disable Debug Mode in Production&lt;/h1&gt;&lt;p&gt;Never deploy with:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;APP_DEBUG=true&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Debug mode leaks:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;SQL queries&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;stack traces&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;environment data&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;internal architecture&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Production must always use:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;APP_ENV=production
APP_DEBUG=false&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;6. Secure Environment Variables&lt;/h1&gt;&lt;p&gt;Your &lt;code&gt;.env&lt;/code&gt; file is one of the most sensitive assets.&lt;/p&gt;&lt;p&gt;Never:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;commit &lt;code&gt;.env&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;expose storage directories&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;allow public access&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;store secrets in frontend builds&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Best practice:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;use cloud secret managers&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;rotate credentials regularly&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;isolate staging and production credentials&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Examples:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;AWS Secrets Manager&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Google Secret Manager&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;HashiCorp Vault&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;7. Harden File Upload Systems&lt;/h1&gt;&lt;p&gt;File uploads are high-risk attack vectors.&lt;/p&gt;&lt;p&gt;Never trust:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;extension names&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;MIME type alone&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;client validation&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Laravel validation example:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;$request-&amp;gt;validate([
    &#39;document&#39; =&amp;gt; [
        &#39;required&#39;,
        &#39;file&#39;,
        &#39;mimes:pdf,docx&#39;,
        &#39;max:2048&#39;,
    ]
]);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Additional protections:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;virus scanning&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;private object storage&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;randomized filenames&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;image re-encoding&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;upload sandboxing&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;8. Add Security Headers&lt;/h1&gt;&lt;p&gt;Security headers reduce browser-based attacks.&lt;/p&gt;&lt;p&gt;Recommended headers:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Content-Security-Policy&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;X-Frame-Options&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;X-Content-Type-Options&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Referrer-Policy&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Example middleware:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;$response-&amp;gt;headers-&amp;gt;set(
    &#39;X-Frame-Options&#39;,
    &#39;SAMEORIGIN&#39;
);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For CSP:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;Content-Security-Policy:
default-src &#39;self&#39;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;9. Secure Laravel Queues &amp;amp; Workers&lt;/h1&gt;&lt;p&gt;Queue workers often run with elevated privileges.&lt;/p&gt;&lt;p&gt;Hardening checklist:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;isolate workers&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;separate queue credentials&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;limit Redis access&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;disable shell execution&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;use supervisor restrictions&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Example Supervisor config:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;user=forge
autorestart=true
stopasgroup=true
killasgroup=true&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;10. Prevent Mass Assignment Vulnerabilities&lt;/h1&gt;&lt;p&gt;Never use unguarded models carelessly.&lt;/p&gt;&lt;p&gt;Bad:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;protected $guarded = [];&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Safer:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;protected $fillable = [
    &#39;name&#39;,
    &#39;email&#39;,
];&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mass assignment bugs are still common in SaaS systems.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;11. Encrypt Sensitive Data&lt;/h1&gt;&lt;p&gt;Laravel encryption should be used for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;tokens&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;API secrets&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;recovery keys&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;financial metadata&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Example:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;use Illuminate\Support\Facades\Crypt;

$encrypted = Crypt::encryptString($token);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;12. Database Security Hardening&lt;/h1&gt;&lt;p&gt;Database users should never have full privileges.&lt;/p&gt;&lt;p&gt;Avoid:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;root database users&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wildcard permissions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;public database exposure&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Recommended:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;private networking&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;least privilege access&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;read/write separation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;audit logging&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;13. Container &amp;amp; Docker Security&lt;/h1&gt;&lt;p&gt;Many Laravel apps now run inside containers.&lt;/p&gt;&lt;p&gt;Common mistakes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;running as root&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;exposing internal ports&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;embedding secrets in images&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Safer Dockerfile:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;RUN addgroup -g 1000 laravel
RUN adduser -u 1000 -G laravel -s /bin/sh -D laravel

USER laravel&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;14. Secure Laravel Horizon&lt;/h1&gt;&lt;p&gt;Laravel Horizon exposes queue metrics and controls.&lt;/p&gt;&lt;p&gt;Never expose Horizon publicly.&lt;/p&gt;&lt;p&gt;Restrict access:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;Horizon::auth(function ($request) {
    return auth()-&amp;gt;check()
        &amp;amp;&amp;amp; auth()-&amp;gt;user()-&amp;gt;is_admin;
});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Even better:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;VPN-only access&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;internal subnet access&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;zero trust access policies&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;15. Add Centralized Security Monitoring&lt;/h1&gt;&lt;p&gt;Security monitoring is essential for modern production systems.&lt;/p&gt;&lt;p&gt;Monitor:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;login failures&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;suspicious IPs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;privilege escalation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;API abuse&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;abnormal queue behavior&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Recommended observability stack:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;OpenTelemetry&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Grafana&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Loki&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Prometheus&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Laravel Pulse&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;16. Prevent Supply Chain Attacks&lt;/h1&gt;&lt;p&gt;Composer packages are now major attack surfaces.&lt;/p&gt;&lt;p&gt;Best practices:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;audit dependencies&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;pin versions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;remove abandoned packages&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;verify maintainers&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Useful commands:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;composer audit&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;composer outdated&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;17. Secure CI/CD Pipelines&lt;/h1&gt;&lt;p&gt;Attackers increasingly target deployment systems.&lt;/p&gt;&lt;p&gt;Protect:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;GitHub Actions secrets&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SSH deployment keys&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;container registries&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;production environments&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Best practices:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;ephemeral credentials&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;signed builds&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;branch protection&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;mandatory reviews&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;18. Use Zero Trust Infrastructure&lt;/h1&gt;&lt;p&gt;Modern Laravel production environments should assume:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;no network is trusted.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Principles:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;identity verification&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;short-lived credentials&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;service isolation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;least privilege networking&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This becomes critical in:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Kubernetes&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;multi-service architectures&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;distributed APIs&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Final Production Security Checklist&lt;/h1&gt;&lt;p&gt;Before deploying Laravel production systems:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;HTTPS enforced&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Debug disabled&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;MFA enabled&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;CSP configured&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Queue isolation enabled&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Rate limiting active&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Secrets externalized&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Dependency audit completed&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;API protection enabled&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Horizon restricted&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Database isolated&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Centralized logging enabled&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Backups encrypted&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;CI/CD hardened&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h1&gt;Conclusion&lt;/h1&gt;&lt;p&gt;Laravel already provides an excellent security foundation.&lt;/p&gt;&lt;p&gt;But production-grade security in 2026 requires much more than framework defaults.&lt;/p&gt;&lt;p&gt;Real security hardening involves:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;infrastructure isolation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;operational monitoring&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;authentication architecture&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;deployment security&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;cloud-native protections&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The most secure Laravel systems are built with:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;layered defenses&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;least privilege access&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;observable infrastructure&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;continuous auditing&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Security is no longer a feature.&lt;/p&gt;&lt;p&gt;It is part of the architecture itself.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/3634607766379985408/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2026/05/laravel-security-hardening-2026.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/3634607766379985408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/3634607766379985408'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2026/05/laravel-security-hardening-2026.html' title='Laravel Security Hardening in 2026: Production-Grade Security Checklist for Modern Laravel Applications'/><author><name>dityalovers</name><uri>http://www.blogger.com/profile/15543044829406906904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFJ8pr0Z5QupoctBQgOc9XjoAD0Fcg0x3MLgL7wr71h6EhPu9GajUrs_H5BZAl9hcC5i_jh71c3MUBo5DRcrWFiO0cFuNIuUMdF2i4iBkBBzKSnfpp5jgJgd-M0xTIzq8VVKRyoadjO8cEN0mEHr9AfL-05mE-qbmlx_CLyHpN8XIViZnXe6KdHTkhCA/s72-w320-h213-c/ChatGPT%20Image%20May%2023,%202026,%2007_08_14%20PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-8805167367528259310</id><published>2026-05-22T21:41:42.489+07:00</published><updated>2026-05-22T21:41:42.489+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PS2"/><title type='text'>Cara Main Game PS2 via LAN SMB di Tahun 2026 Menggunakan OPL + HDD/Flashdisk</title><content type='html'>&lt;p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI5klt_F_KMVJCU6bilKAl8dsPKyHIvnXDJKGYMWS_5hXelSSz5tDZ2ENSi7XYo0CWsauY4-TtN_9gG5jwg3tCnxFmx570ykLutppCPn8R9knnsvlDp8FNVE7YlywxzObsr_9n2TSdZheZq_R_oyPTwZ10AEnFRrayQ3SmyLpF7cBLONn3YXLrcvDXZA/s1536/ChatGPT%20Image%20May%2022,%202026,%2009_39_56%20PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1536&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI5klt_F_KMVJCU6bilKAl8dsPKyHIvnXDJKGYMWS_5hXelSSz5tDZ2ENSi7XYo0CWsauY4-TtN_9gG5jwg3tCnxFmx570ykLutppCPn8R9knnsvlDp8FNVE7YlywxzObsr_9n2TSdZheZq_R_oyPTwZ10AEnFRrayQ3SmyLpF7cBLONn3YXLrcvDXZA/w320-h213/ChatGPT%20Image%20May%2022,%202026,%2009_39_56%20PM.png&quot; title=&quot;cara main game PS2 via LAN SMB menggunakan Open PS2 Loader (OPL), Free McBoot, dan sharing folder SMB di Windows maupun Linux tahun 2026&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Komunitas PlayStation 2 masih sangat aktif sampai sekarang. Salah satu metode favorit untuk memainkan game PS2 tanpa DVD adalah menggunakan jaringan LAN SMB melalui Open PS2 Loader (OPL). Metode ini terkenal lebih cepat dibanding USB biasa dan jauh lebih awet karena tidak memakai optical drive.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Artikel ini membahas cara setting PS2 SMB terbaru di tahun 2026 menggunakan:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Free McBoot (FMCB)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Open PS2 Loader (OPL)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Kabel LAN&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Sharing folder SMB di Windows/Linux&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;HDD internal, SSD, atau flashdisk sebagai storage game&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Metode ini cocok untuk:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;PS2 Fat&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;PS2 Slim&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;OPL terbaru&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Pengguna jaringan rumah modern&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Apa Itu SMB di PS2?&lt;/h2&gt;&lt;p&gt;SMB (Server Message Block) adalah protokol sharing file melalui jaringan lokal. Dengan SMB, PS2 dapat membaca game ISO langsung dari komputer atau NAS tanpa perlu membakar DVD.&lt;/p&gt;&lt;p&gt;Keunggulan SMB dibanding USB:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;p&gt;Fitur&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;USB&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;SMB LAN&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Kecepatan loading&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Lambat&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Lebih cepat&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;FMV patah-patah&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Kadang iya&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Lebih stabil&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Kompatibilitas game&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Sedang&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Tinggi&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Umur USB&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Cepat panas&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Lebih aman&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Cocok untuk game besar&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Tidak selalu&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Sangat cocok&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Kebutuhan yang Harus Disiapkan&lt;/h2&gt;&lt;p&gt;Sebelum mulai, siapkan beberapa perangkat berikut:&lt;/p&gt;&lt;h3&gt;Hardware&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;PS2 Fat atau Slim&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Memory Card Free McBoot&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Kabel LAN RJ45&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Router atau koneksi langsung ke PC&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Flashdisk/HDD/NAS/SSD&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Software&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Open PS2 Loader terbaru&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;OPL Manager&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SMB Server (Windows Sharing atau Samba Linux)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Struktur Folder Game OPL SMB&lt;/h2&gt;&lt;p&gt;Buat folder sharing misalnya:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;PS2SMB/
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Di dalamnya buat struktur:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;CD/
DVD/
ART/
CFG/
THM/
VMC/
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Keterangan:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;DVD&lt;/code&gt; untuk game DVD ISO&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;CD&lt;/code&gt; untuk game format CD&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;ART&lt;/code&gt; untuk cover game&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;CFG&lt;/code&gt; untuk konfigurasi OPL&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;THM&lt;/code&gt; untuk theme&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;VMC&lt;/code&gt; untuk virtual memory card&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Cara Sharing Folder SMB di Windows 11&lt;/h2&gt;&lt;h3&gt;1. Aktifkan SMB 1.0&lt;/h3&gt;&lt;p&gt;Walaupun SMB1 sudah tua, OPL masih menggunakan kompatibilitas SMB klasik.&lt;/p&gt;&lt;p&gt;Masuk ke:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;Control Panel → Programs → Turn Windows features on or off
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Centang:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;SMB 1.0/CIFS File Sharing Support
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restart komputer.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;2. Share Folder&lt;/h3&gt;&lt;p&gt;Klik kanan folder:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;PS2SMB → Properties → Sharing
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aktifkan:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;Advanced Sharing
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Berikan nama share:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;PS2SMB
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Permission:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;Everyone → Full Control
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;3. Atur IP Static PC&lt;/h3&gt;&lt;p&gt;Contoh:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;IP Address : 192.168.1.10
Subnet     : 255.255.255.0
Gateway    : 192.168.1.1
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Setting OPL SMB di PS2&lt;/h2&gt;&lt;p&gt;Masuk ke:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;Settings → Network Settings
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Isi:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;p&gt;Parameter&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;Contoh&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;PS2 IP&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;192.168.1.20&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Mask&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;255.255.255.0&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Gateway&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;192.168.1.1&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;SMB Server Address&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;192.168.1.10&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Share Name&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;PS2SMB&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Username&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;guest&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Password&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;kosong&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Simpan konfigurasi lalu restart OPL.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Format Penamaan ISO PS2&lt;/h2&gt;&lt;p&gt;Gunakan format:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;SLUS_123.45.Nama Game.iso
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Contoh:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;SLUS_209.46.God of War.iso
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Format ini penting agar cover dan compatibility database terbaca dengan benar.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Cara Transfer Game ke Folder SMB&lt;/h2&gt;&lt;p&gt;Cukup copy file ISO ke folder:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;DVD/
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Untuk game CD:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;CD/
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tidak perlu install seperti WinHIIP.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Menggunakan OPL Manager&lt;/h2&gt;&lt;p&gt;Agar tampilan lebih rapi:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Install OPL Manager&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Scan folder game&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Download cover otomatis&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Generate ART dan CFG&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Keuntungan:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Cover game otomatis&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Informasi game lengkap&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Setting compatibility lebih mudah&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Setting Optimal OPL Tahun 2026&lt;/h2&gt;&lt;p&gt;Berikut setting yang umum dipakai komunitas:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;p&gt;Setting&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;Rekomendasi&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;ETH Device Start Mode&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Auto&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Default Menu&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;ETH Games&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Enable Write Operations&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Off&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IGR&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Off jika game crash&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;GSM&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Sesuaikan TV&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Game PS2 yang Cocok via SMB&lt;/h2&gt;&lt;p&gt;Beberapa game berjalan sangat baik lewat SMB:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;God of War&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Resident Evil 4&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Shadow of the Colossus&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Final Fantasy X&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Persona 4&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Gran Turismo 4&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Black&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Okami&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Game FMV berat biasanya lebih lancar dibanding USB.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Kelebihan SMB Dibanding HDD Internal&lt;/h2&gt;&lt;p&gt;Walaupun HDD internal tetap paling cepat untuk PS2 Fat, SMB punya beberapa keunggulan:&lt;/p&gt;&lt;h3&gt;1. Mudah Menambah Game&lt;/h3&gt;&lt;p&gt;Tidak perlu bongkar HDD.&lt;/p&gt;&lt;h3&gt;2. Storage Lebih Fleksibel&lt;/h3&gt;&lt;p&gt;Bisa menggunakan:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;SSD&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;NAS&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;HDD eksternal&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Server Linux&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;3. Multi Device&lt;/h3&gt;&lt;p&gt;Satu server bisa dipakai beberapa PS2.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Troubleshooting OPL SMB&lt;/h2&gt;&lt;h3&gt;OPL Tidak Menemukan Server&lt;/h3&gt;&lt;p&gt;Cek:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Firewall Windows&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Kabel LAN&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;IP Address&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SMB1 aktif&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;Game Tidak Muncul&lt;/h3&gt;&lt;p&gt;Pastikan:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;ISO berada di folder DVD&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Nama file benar&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Share folder permission benar&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;Loading Lama&lt;/h3&gt;&lt;p&gt;Gunakan:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Kabel LAN berkualitas&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SSD/NVMe pada server&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Router gigabit&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;SMB di Linux Menggunakan Samba&lt;/h2&gt;&lt;p&gt;Untuk pengguna Linux:&lt;/p&gt;&lt;p&gt;Install Samba:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;sudo apt install samba
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Contoh konfigurasi:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;[PS2SMB]
path = /srv/ps2
browseable = yes
read only = no
guest ok = yes
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restart service:&lt;/p&gt;&lt;div class=&quot;toastui-editor-ww-code-block&quot; data-language=&quot;text&quot;&gt;&lt;pre&gt;&lt;code&gt;sudo systemctl restart smbd
&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Kombinasi Setup PS2 Terbaik Tahun 2026&lt;/h2&gt;&lt;p&gt;Berikut setup favorit komunitas retro gaming:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;p&gt;Komponen&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;Rekomendasi&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;FMCB&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Versi terbaru&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;OPL&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;OPL Daily Build&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Storage&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;SSD SATA&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Network&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Gigabit Router&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Display&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;HDMI Converter PS2&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Apakah SMB Masih Worth It di Tahun 2026?&lt;/h2&gt;&lt;p&gt;Jawabannya masih sangat worth it.&lt;/p&gt;&lt;p&gt;Bahkan banyak komunitas retro gaming modern lebih memilih SMB karena:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Setup fleksibel&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tidak merusak optik PS2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Loading lebih stabil&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Mudah backup game&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Bisa integrasi NAS rumah&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Dengan OPL terbaru, kompatibilitas game juga semakin baik.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Kesimpulan&lt;/h2&gt;&lt;p&gt;Main game PS2 via LAN SMB masih menjadi salah satu metode terbaik di tahun 2026. Dengan kombinasi Free McBoot dan Open PS2 Loader, pengguna bisa menikmati game PS2 langsung dari jaringan tanpa DVD.&lt;/p&gt;&lt;p&gt;Selain lebih cepat dibanding USB, metode SMB juga lebih aman untuk hardware PS2 yang usianya sudah cukup tua.&lt;/p&gt;&lt;p&gt;Jika sebelumnya kamu sudah menggunakan:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Free McBoot&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;uLaunchELF&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;OPL&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;HDD internal&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;maka SMB adalah upgrade berikutnya yang wajib dicoba.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Artikel Terkait&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://dityalovers.blogspot.com/2026/05/free-mcboot-dan-ulaunchelf-kombinasi.html&quot;&gt;Free McBoot dan uLaunchELF Kombinasi Terbaik PS2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://dityalovers.blogspot.com/2026/05/ulaunchelf-ps2-file-explorer-legendaris.html&quot;&gt;uLaunchELF PS2 File Explorer Legendaris&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://dityalovers.blogspot.com/2010/08/install-game-ps2-ke-hardisk-via-winhiip.html&quot;&gt;Install Game PS2 ke Harddisk via WinHIIP&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://dityalovers.blogspot.com/2010/09/linux-for-ps2-using-kernelloader.html&quot;&gt;Linux for PS2 Using Kernelloader&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/8805167367528259310/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2026/05/cara-main-game-ps2-via-lan-smb-opl-2026.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/8805167367528259310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/8805167367528259310'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2026/05/cara-main-game-ps2-via-lan-smb-opl-2026.html' title='Cara Main Game PS2 via LAN SMB di Tahun 2026 Menggunakan OPL + HDD/Flashdisk'/><author><name>dityalovers</name><uri>http://www.blogger.com/profile/15543044829406906904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI5klt_F_KMVJCU6bilKAl8dsPKyHIvnXDJKGYMWS_5hXelSSz5tDZ2ENSi7XYo0CWsauY4-TtN_9gG5jwg3tCnxFmx570ykLutppCPn8R9knnsvlDp8FNVE7YlywxzObsr_9n2TSdZheZq_R_oyPTwZ10AEnFRrayQ3SmyLpF7cBLONn3YXLrcvDXZA/s72-w320-h213-c/ChatGPT%20Image%20May%2022,%202026,%2009_39_56%20PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-708286802773997830</id><published>2026-05-16T21:54:40.273+07:00</published><updated>2026-05-16T21:54:40.274+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PS2"/><title type='text'>Free McBoot dan uLaunchELF: Kombinasi Wajib untuk Modding PlayStation 2</title><content type='html'>&lt;div style=&quot;text-align: left;&quot;&gt;Bagi penggemar modding PlayStation 2, dua nama yang hampir tidak bisa dipisahkan adalah &lt;strong&gt;Free McBoot (FMCB)&lt;/strong&gt; dan &lt;strong&gt;uLaunchELF&lt;/strong&gt;. Keduanya menjadi fondasi utama untuk menjalankan homebrew, backup game, emulator, hingga Open PS2 Loader (OPL) tanpa perlu modchip tambahan.&lt;/div&gt;&lt;p&gt;Di artikel lama DityaLovers tentang uLaunchELF, aplikasi ini dijelaskan sebagai file explorer untuk PS2 yang mampu membuka dan menjalankan berbagai file dari memory card maupun flashdisk. Sekarang, mari kita bahas bagaimana Free McBoot dan uLaunchELF bekerja bersama untuk membuka fitur tersembunyi PS2.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Apa Itu Free McBoot?&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Free McBoot&lt;/strong&gt; adalah exploit memory card PS2 yang memungkinkan konsol menjalankan aplikasi homebrew secara otomatis saat booting.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Dengan FMCB, pengguna bisa:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Menjalankan Open PS2 Loader (OPL)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Membuka uLaunchELF&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Menjalankan emulator retro&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Memutar video dengan SMS Player&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Mengakses file manager PS2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Menjalankan aplikasi ELF tanpa modchip&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;FMCB menjadi sangat populer karena instalasinya relatif aman dan tidak memerlukan solder hardware seperti modchip lama.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Peran uLaunchELF dalam Free McBoot&lt;/h2&gt;&lt;p&gt;uLaunchELF berfungsi sebagai “Windows Explorer” di PS2. Hampir semua pengguna FMCB memakai uLaunchELF untuk:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Copy file ELF&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Install aplikasi homebrew&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Backup save game&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Mengatur memory card&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Memindahkan file OPL&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Mengakses flashdisk USB&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Tanpa uLaunchELF, proses manajemen file di PS2 akan jauh lebih sulit.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Kenapa Kombinasi Ini Sangat Populer?&lt;/h2&gt;&lt;p&gt;Pada era PS2 modern, kombinasi FMCB + uLaunchELF dianggap setup standar karena:&lt;/p&gt;&lt;h3&gt;1. Tidak Perlu Modchip&lt;/h3&gt;&lt;p&gt;Banyak pengguna PS2 slim takut risiko solder modchip merusak motherboard. FMCB menawarkan solusi softmod yang jauh lebih aman.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;2. Bisa Menjalankan Game dari HDD atau USB&lt;/h3&gt;&lt;p&gt;Setelah FMCB aktif, pengguna bisa menjalankan OPL untuk memainkan game dari:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Harddisk internal&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SMB Network&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;USB Flashdisk&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;uLaunchELF membantu proses setup file dan konfigurasi OPL.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;3. Backup Save Game Jadi Mudah&lt;/h3&gt;&lt;p&gt;Save game PS2 sangat rentan corrupt, terutama memory card murah. Dengan uLaunchELF, backup save ke flashdisk bisa dilakukan hanya dalam beberapa langkah.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;4. Mendukung Banyak Homebrew&lt;/h3&gt;&lt;p&gt;Komunitas homebrew PS2 masih aktif sampai sekarang. Banyak aplikasi modern masih kompatibel dengan FMCB dan uLaunchELF.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Contohnya:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;RetroArch PS2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GSM Selector&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;POPStarter&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;OPL Daily Builds&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;ESR Disc Launcher&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Cara Menggunakan uLaunchELF untuk Install OPL&lt;/h2&gt;&lt;p&gt;Berikut langkah sederhana:&lt;/p&gt;&lt;h3&gt;Persiapan&lt;/h3&gt;&lt;p&gt;Yang dibutuhkan:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;PS2 dengan FMCB&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Flashdisk FAT32&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;File OPL &lt;code data-backticks=&quot;1&quot;&gt;.ELF&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;uLaunchELF&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;Langkah Install&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Copy &lt;code data-backticks=&quot;1&quot;&gt;OPL.ELF&lt;/code&gt; ke flashdisk&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Colok USB ke PS2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Jalankan uLaunchELF&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Buka &lt;code data-backticks=&quot;1&quot;&gt;mass:/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Copy file OPL&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Paste ke memory card atau HDD&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tambahkan shortcut di menu FMCB&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Setelah itu OPL bisa dijalankan langsung dari menu utama PS2.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;uLaunchELF vs File Browser Bawaan PS2&lt;/h2&gt;&lt;p&gt;Browser bawaan PS2 sangat terbatas. Hanya bisa melihat memory card dan disc.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Sedangkan uLaunchELF mendukung:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;p&gt;Fitur&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;Browser PS2&lt;/p&gt;&lt;/th&gt;&lt;th&gt;&lt;p&gt;uLaunchELF&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Copy file&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Tidak&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Ya&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;USB support&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Tidak&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Ya&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Jalankan ELF&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Tidak&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Ya&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;FTP&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Tidak&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Ya&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;HDD internal&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Tidak&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Ya&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Edit konfigurasi&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Tidak&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Ya&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Karena itulah hampir semua tutorial modding PS2 menggunakan uLaunchELF.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Tips Aman Menggunakan uLaunchELF&lt;/h2&gt;&lt;h3&gt;Gunakan Flashdisk FAT32&lt;/h3&gt;&lt;p&gt;PS2 lebih stabil membaca FAT32 dibanding NTFS atau exFAT pada versi lama.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;Jangan Hapus Folder Sistem FMCB&lt;/h3&gt;&lt;p&gt;Folder seperti:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code data-backticks=&quot;1&quot;&gt;BOOT&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code data-backticks=&quot;1&quot;&gt;SYS-CONF&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code data-backticks=&quot;1&quot;&gt;FREEMCB&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;sangat penting untuk booting FMCB.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;Backup Memory Card Secara Berkala&lt;/h3&gt;&lt;p&gt;Gunakan uLaunchELF untuk copy seluruh isi memory card ke USB.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Apakah uLaunchELF Masih Relevan di 2026?&lt;/h2&gt;&lt;p&gt;Jawabannya: masih sangat relevan.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Komunitas PS2 retro gaming terus berkembang karena:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Harga PS2 masih murah&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Banyak kolektor retro&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Emulator PS2 belum selalu stabil di perangkat low-end&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Sensasi bermain di hardware asli tetap berbeda&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;uLaunchELF masih menjadi tool utama untuk maintenance dan homebrew PS2.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Kesimpulan&lt;/h2&gt;&lt;p&gt;Jika Free McBoot adalah “pintu masuk” modding PS2, maka uLaunchELF adalah alat utama untuk mengelola semuanya.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Kombinasi keduanya membuat PlayStation 2 memiliki fitur jauh lebih modern dibanding fungsi bawaan Sony dahulu.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Bagi penggemar retro gaming dan modding konsol, memahami cara kerja uLaunchELF adalah skill dasar yang wajib dimiliki.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/708286802773997830/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2026/05/free-mcboot-dan-ulaunchelf-kombinasi.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/708286802773997830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/708286802773997830'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2026/05/free-mcboot-dan-ulaunchelf-kombinasi.html' title='Free McBoot dan uLaunchELF: Kombinasi Wajib untuk Modding PlayStation 2'/><author><name>dityalovers</name><uri>http://www.blogger.com/profile/15543044829406906904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-2038016385314245107</id><published>2026-05-16T21:51:06.528+07:00</published><updated>2026-05-16T21:51:06.528+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PS2"/><title type='text'>uLaunchELF PS2: File Explorer Legendaris untuk Modding dan Backup Save Game</title><content type='html'>&lt;p&gt;Kalau kamu pernah utak-atik PlayStation 2, kemungkinan besar kamu pernah dengar nama &lt;strong&gt;uLaunchELF&lt;/strong&gt; atau biasa disingkat &lt;strong&gt;uLE&lt;/strong&gt;. Aplikasi homebrew ini sudah jadi “senjata wajib” bagi pengguna PS2 modchip, Free McBoot, maupun harddisk internal sejak era warnet PS2 dan rental game dulu.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Artikel lama di &lt;a href=&quot;https://dityalovers.blogspot.com/2010/09/ulaunch-file-explorer-ps2.html?utm_source=chatgpt.com&quot;&gt;DityaLovers Blog&lt;/a&gt; pernah membahas fungsi dasar uLaunchELF sebagai file manager PS2. Sekarang, mari kita bahas lebih lengkap fitur, manfaat, dan kenapa software ini masih relevan di tahun 2026.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Apa Itu uLaunchELF?&lt;/h2&gt;&lt;p&gt;uLaunchELF adalah aplikasi homebrew untuk PS2 yang berfungsi seperti Windows Explorer di PC. Dengan aplikasi ini, pengguna dapat membuka, menyalin, menghapus, menjalankan, hingga memindahkan file dari berbagai media penyimpanan di PS2. ([Dityalovers][1])&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Selain menjadi file manager, uLaunchELF juga bisa digunakan untuk:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Menjalankan file &lt;code data-backticks=&quot;1&quot;&gt;.ELF&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Backup dan restore save game&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Mengelola harddisk PS2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Membuka file TXT dan JPG&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;FTP transfer via jaringan&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Launch aplikasi homebrew lain&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Instal booting Free McBoot&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Menjalankan emulator dan utility PS2&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Bahkan komunitas modding PS2 menyebut uLaunchELF sebagai software paling penting untuk modifikasi PS2. ([ConsoleMods][2])&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Fitur Utama uLaunchELF&lt;/h2&gt;&lt;p&gt;Berikut beberapa fitur populer dari uLaunchELF:&lt;/p&gt;&lt;h3&gt;1. File Browser Lengkap&lt;/h3&gt;&lt;p&gt;uLaunchELF dapat membaca berbagai direktori PS2 seperti:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code data-backticks=&quot;1&quot;&gt;mc0:/&lt;/code&gt; → Memory Card slot 1&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code data-backticks=&quot;1&quot;&gt;mc1:/&lt;/code&gt; → Memory Card slot 2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code data-backticks=&quot;1&quot;&gt;mass:/&lt;/code&gt; → USB Flashdisk&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code data-backticks=&quot;1&quot;&gt;hdd0:/&lt;/code&gt; → Harddisk internal PS2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code data-backticks=&quot;1&quot;&gt;cdfs:/&lt;/code&gt; → CD/DVD PS2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code data-backticks=&quot;1&quot;&gt;host:/&lt;/code&gt; → Koneksi jaringan/PC&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Fitur ini membuat transfer save game atau aplikasi homebrew jadi jauh lebih mudah. ([Gmzware][3])&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;2. Menjalankan File ELF&lt;/h3&gt;&lt;p&gt;File &lt;code data-backticks=&quot;1&quot;&gt;.ELF&lt;/code&gt; di PS2 mirip seperti &lt;code data-backticks=&quot;1&quot;&gt;.EXE&lt;/code&gt; di Windows. Dengan uLaunchELF, kamu bisa menjalankan:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Open PS2 Loader (OPL)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Emulator PS1/Arcade&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;RetroArch&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;HDLoader&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SMS Media Player&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Utility patcher dan installer&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Karena itulah uLaunchELF sering jadi launcher utama pada memory card Free McBoot.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;3. Backup Save Game PS2&lt;/h3&gt;&lt;p&gt;Salah satu fungsi favorit pengguna PS2 adalah backup save game ke flashdisk.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Langkah sederhananya:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Masuk ke &lt;code data-backticks=&quot;1&quot;&gt;mc0:/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Pilih folder save game&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tekan &lt;code data-backticks=&quot;1&quot;&gt;R1&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Pilih &lt;code data-backticks=&quot;1&quot;&gt;Copy&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Masuk ke &lt;code data-backticks=&quot;1&quot;&gt;mass:/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Paste save game&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Fitur ini sangat berguna untuk mencegah save corrupt atau memory card rusak.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;4. Booting Langsung dari Memory Card&lt;/h3&gt;&lt;p&gt;Pengguna modchip seperti Matrix atau Modbo sering memakai uLaunchELF sebagai boot utama dari memory card.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Bahkan banyak tutorial lama menggunakan kombinasi tombol seperti:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Tahan &lt;code data-backticks=&quot;1&quot;&gt;R1&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tahan &lt;code data-backticks=&quot;1&quot;&gt;R2&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;DEV1 mode&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;untuk langsung masuk ke uLaunchELF saat PS2 dinyalakan. ([Dityalovers][1])&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Perbedaan uLaunchELF dan wLaunchELF&lt;/h2&gt;&lt;p&gt;Versi modern dari uLaunchELF sekarang dikenal sebagai &lt;strong&gt;wLaunchELF&lt;/strong&gt;. Proyek ini merupakan penerus resmi komunitas homebrew PS2. ([ConsoleMods][2])&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Beberapa peningkatan wLaunchELF:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Support exFAT&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Kompatibilitas USB lebih baik&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Perbaikan FTP server&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Stabilitas lebih tinggi&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Dukungan homebrew terbaru&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Meski begitu, banyak pengguna masih menyebutnya “uLaunchELF” karena sudah menjadi nama legendaris di komunitas PS2.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Kenapa uLaunchELF Masih Populer?&lt;/h2&gt;&lt;p&gt;Walaupun PlayStation 5 dan emulator modern sudah berkembang, komunitas PlayStation 2 masih sangat aktif.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Alasan uLaunchELF tetap dipakai:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;PS2 masih populer di Indonesia&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Banyak rental dan kolektor retro&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Mendukung homebrew&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Sangat ringan&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Kompatibel dengan Free McBoot&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Mempermudah instalasi OPL dan game HDD&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Bahkan di forum Reddit masih banyak pengguna baru yang belajar menggunakan uLaunchELF untuk instal emulator dan OPL di PS2 mereka. ([Reddit][4])&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Cara Install uLaunchELF di PS2&lt;/h2&gt;&lt;h3&gt;Menggunakan Free McBoot&lt;/h3&gt;&lt;p&gt;Cara paling mudah:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Copy file &lt;code data-backticks=&quot;1&quot;&gt;BOOT.ELF&lt;/code&gt; ke flashdisk&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Jalankan File Browser&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Masuk ke &lt;code data-backticks=&quot;1&quot;&gt;mass:/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Copy file ELF&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Paste ke memory card&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tambahkan shortcut di FMCB Configurator&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;Menggunakan CD/DVD&lt;/h3&gt;&lt;p&gt;Metode klasik:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Download ISO uLaunchELF&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Burn ke CD/DVD&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Jalankan di PS2 modchip&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Metode ini populer di era PS2 optik sebelum OPL booming. ([Dityalovers][1])&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Kesimpulan&lt;/h2&gt;&lt;p&gt;uLaunchELF bukan sekadar file manager biasa. Software ini adalah fondasi utama dunia modding PS2. Mulai dari backup save, menjalankan homebrew, instal Free McBoot, hingga launch OPL — semuanya hampir selalu melibatkan uLaunchELF.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Bagi pecinta PlayStation 2, aplikasi ini masih menjadi tool wajib bahkan setelah lebih dari 20 tahun sejak PS2 dirilis.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Kalau kamu masih punya PS2 di rumah, uLaunchELF adalah aplikasi pertama yang wajib dicoba.&lt;/p&gt;&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h2&gt;Referensi dan Dokumentasi&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://dityalovers.blogspot.com/2010/09/ulaunch-file-explorer-ps2.html?utm_source=chatgpt.com&quot;&gt;Artikel original DityaLovers tentang uLaunchELF&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/ps2homebrew/wLaunchELF?utm_source=chatgpt.com&quot;&gt;wLaunchELF GitHub Project&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://consolemods.org/wiki/PS2%3ALaunchELF?utm_source=chatgpt.com&quot;&gt;ConsoleMods PS2 LaunchELF Wiki&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://ps2ulaunchelf.pbworks.com/w/page/19520134/FrontPage?utm_source=chatgpt.com&quot;&gt;uLaunchELF Documentation Wiki&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/2038016385314245107/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2026/05/ulaunchelf-ps2-file-explorer-legendaris.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/2038016385314245107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/2038016385314245107'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2026/05/ulaunchelf-ps2-file-explorer-legendaris.html' title='uLaunchELF PS2: File Explorer Legendaris untuk Modding dan Backup Save Game'/><author><name>dityalovers</name><uri>http://www.blogger.com/profile/15543044829406906904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-1325926930964937547</id><published>2026-05-05T01:07:00.001+07:00</published><updated>2026-05-05T01:11:22.696+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI SDK"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><title type='text'>Laravel 13 AI SDK: Building Real AI Features Without Fighting the Framework</title><content type='html'>&lt;article&gt;
  

&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNLyjvmZm5V37zdxhosOw0CT_3jBEke6qajtc_0lFNkhiQgRmpjahNqBLE-rT4CQOGckeuC59-e0_8iOQWwi6GaVYGCo-Y-DLEVAenNxeWFie3rljHUGNIUWUuPWA9-KhmPuKkEkKTr-AB6oqRs4nHp7pN7qscz0NMU-ohN40_00_9-bPV2bxnwoxdEg/s1536/ChatGPT%20Image%20May%205,%202026,%2001_04_40%20AM.png&quot; style=&quot;display: block; padding: 1em 0px; text-align: center;&quot;&gt;&lt;img alt=&quot;Laravel 13&quot; border=&quot;0&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1536&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNLyjvmZm5V37zdxhosOw0CT_3jBEke6qajtc_0lFNkhiQgRmpjahNqBLE-rT4CQOGckeuC59-e0_8iOQWwi6GaVYGCo-Y-DLEVAenNxeWFie3rljHUGNIUWUuPWA9-KhmPuKkEkKTr-AB6oqRs4nHp7pN7qscz0NMU-ohN40_00_9-bPV2bxnwoxdEg/w320-h213/ChatGPT%20Image%20May%205,%202026,%2001_04_40%20AM.png&quot; title=&quot;Laravel 13 AI SDK&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

  &lt;p&gt;
    Laravel has always had a habit of absorbing complexity and returning something clean on the other side. 
    The new Laravel 13 AI SDK follows that same pattern—but this time the complexity isn’t just HTTP or queues. 
    It’s AI integration itself.
  &lt;/p&gt;

  &lt;p&gt;
    Most developers don’t struggle with calling AI APIs. They struggle with everything around it: provider differences, 
    streaming quirks, structured output parsing, retries, tool calling, embeddings, and glue code that slowly turns into 
    a second framework inside your framework.
  &lt;/p&gt;

  &lt;p&gt;
    The Laravel AI SDK tries to collapse all of that into something that still feels like Laravel. Not “Laravel inspired”. 
    Actually Laravel.
  &lt;/p&gt;

  &lt;hr&gt;

  &lt;h2&gt;The real shift in Laravel 13: AI is no longer “external”&lt;/h2&gt;

  &lt;p&gt;Before this SDK, integrating AI in Laravel usually looked like:&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;OpenAI PHP client (or similar)&lt;/li&gt;
    &lt;li&gt;custom service layer&lt;/li&gt;
    &lt;li&gt;manual prompt handling&lt;/li&gt;
    &lt;li&gt;JSON decoding everywhere&lt;/li&gt;
    &lt;li&gt;ad-hoc retry logic&lt;/li&gt;
    &lt;li&gt;scattered controller logic&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;
    It worked, but it never felt native.
  &lt;/p&gt;

  &lt;p&gt;
    Laravel 13 changes that assumption. AI is now treated like cache, queues, and HTTP client—a first-class system, not a side integration.
  &lt;/p&gt;

  &lt;p&gt;
    The SDK provides a unified API across providers like OpenAI, Anthropic, Gemini, and others while keeping a consistent Laravel-style interface.
  &lt;/p&gt;

  &lt;hr&gt;

  &lt;h2&gt;The core idea: “Agents” instead of “requests”&lt;/h2&gt;

  &lt;p&gt;
    The most important mental model shift is this: you don’t call AI. You define an agent that behaves like a system.
  &lt;/p&gt;

  &lt;p&gt;An agent is a PHP class that owns:&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;instructions (system behavior)&lt;/li&gt;
    &lt;li&gt;conversation context&lt;/li&gt;
    &lt;li&gt;tools (functions it can call)&lt;/li&gt;
    &lt;li&gt;structured output rules&lt;/li&gt;
    &lt;li&gt;optional memory&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;Instead of writing:&lt;/p&gt;

  &lt;pre&gt;&lt;code&gt;$response = OpenAI::chat([...]);&lt;/code&gt;&lt;/pre&gt;

  &lt;p&gt;You define something like:&lt;/p&gt;

  &lt;pre&gt;&lt;code&gt;
class SupportAgent implements Agent
{
    public function instructions(): string
    {
        return &quot;You are a strict support assistant. Be precise.&quot;;
    }
}
  &lt;/code&gt;&lt;/pre&gt;

  &lt;p&gt;And use it like a service:&lt;/p&gt;

  &lt;pre&gt;&lt;code&gt;$response = app(SupportAgent::class)-&gt;prompt(&quot;My order is late&quot;);&lt;/code&gt;&lt;/pre&gt;

  &lt;p&gt;
    AI logic stops leaking into controllers. That’s the real win.
  &lt;/p&gt;

  &lt;hr&gt;

  &lt;h2&gt;Structured output: where things get serious&lt;/h2&gt;

  &lt;p&gt;
    If you’ve ever parsed AI responses in production, you know the pain: invalid JSON, missing fields, and inconsistent formatting.
  &lt;/p&gt;

  &lt;p&gt;
    Laravel AI SDK solves this by enforcing structure using PHP schemas.
  &lt;/p&gt;

  &lt;pre&gt;&lt;code&gt;
public function schema(JsonSchema $schema): array
{
    return [
        &#39;score&#39; =&gt; $schema-&gt;integer()-&gt;required(),
        &#39;confidence&#39; =&gt; $schema-&gt;string()-&gt;required(),
    ];
}
  &lt;/code&gt;&lt;/pre&gt;

  &lt;p&gt;
    This turns AI output into something you can safely rely on in backend logic.
  &lt;/p&gt;

  &lt;hr&gt;

  &lt;h2&gt;Tools: where AI stops being a chatbot&lt;/h2&gt;

  &lt;p&gt;
    Tools allow an AI agent to call real application logic:
  &lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;database queries&lt;/li&gt;
    &lt;li&gt;API calls&lt;/li&gt;
    &lt;li&gt;file search&lt;/li&gt;
    &lt;li&gt;internal services&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;
    This is where “AI feature” becomes “AI system”.
  &lt;/p&gt;

  &lt;p&gt;
    Instead of just generating text, AI can execute workflows. Laravel’s existing architecture—queues, jobs, service container—makes this feel natural.
  &lt;/p&gt;

  &lt;hr&gt;

  &lt;h2&gt;Streaming, queues, and real UX thinking&lt;/h2&gt;

  &lt;p&gt;
    The SDK doesn’t treat AI as a blocking request. You can stream responses, queue long generations, and broadcast events in real time.
  &lt;/p&gt;

  &lt;p&gt;
    This matters because AI latency is unpredictable. Laravel leans on queues and events instead of reinventing async patterns.
  &lt;/p&gt;

  &lt;hr&gt;

  &lt;h2&gt;Embeddings and vector workflows become native patterns&lt;/h2&gt;

  &lt;p&gt;
    Embeddings support enables semantic search, document retrieval, and recommendation systems without external glue code.
  &lt;/p&gt;

  &lt;p&gt;
    Most real-world AI features aren’t chatbots—they are retrieval systems wrapped in chat interfaces.
  &lt;/p&gt;

  &lt;hr&gt;

  &lt;h2&gt;What actually changes in your architecture&lt;/h2&gt;

  &lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Controllers contain AI logic&lt;/li&gt;
    &lt;li&gt;Prompt strings scattered everywhere&lt;/li&gt;
    &lt;li&gt;JSON parsing in multiple places&lt;/li&gt;
    &lt;li&gt;No consistent retry or tool system&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Agents own behavior&lt;/li&gt;
    &lt;li&gt;Controllers just call services&lt;/li&gt;
    &lt;li&gt;AI logic becomes testable&lt;/li&gt;
    &lt;li&gt;Structured outputs replace fragile parsing&lt;/li&gt;
    &lt;li&gt;Tools extend system capabilities cleanly&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;
    Fewer failure points, not just cleaner code.
  &lt;/p&gt;

  &lt;hr&gt;

  &lt;h2&gt;The uncomfortable truth&lt;/h2&gt;

  &lt;p&gt;
    The SDK doesn’t make AI easy. It removes repetition, not responsibility.
  &lt;/p&gt;

  &lt;p&gt;You still need to understand:&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;prompt design&lt;/li&gt;
    &lt;li&gt;context limits&lt;/li&gt;
    &lt;li&gt;tool safety&lt;/li&gt;
    &lt;li&gt;cost control&lt;/li&gt;
    &lt;li&gt;latency tradeoffs&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;
    What Laravel removes is the distracting glue code around those problems.
  &lt;/p&gt;

  &lt;hr&gt;

  &lt;h2&gt;When you shouldn’t use it&lt;/h2&gt;

  &lt;p&gt;
    This SDK is not always necessary. It may be overkill for:
  &lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;simple one-off completions&lt;/li&gt;
    &lt;li&gt;static prompt utilities&lt;/li&gt;
    &lt;li&gt;scripts without structure or tools&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;
    In those cases, direct API calls can still be simpler.
  &lt;/p&gt;

  &lt;hr&gt;

  &lt;h2&gt;Final thoughts&lt;/h2&gt;

  &lt;p&gt;
    Laravel 13’s AI SDK is not interesting because it adds AI. It’s interesting because it normalizes AI inside backend architecture.
  &lt;/p&gt;

  &lt;p&gt;
    It treats AI like something that can be structured, tested, queued, extended with tools, and versioned.
  &lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Not smarter prompts. Cleaner systems.&lt;/strong&gt;&lt;/p&gt;

&lt;/article&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/1325926930964937547/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2026/05/laravel-13-ai-sdk-building-real-ai.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1325926930964937547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1325926930964937547'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2026/05/laravel-13-ai-sdk-building-real-ai.html' title='Laravel 13 AI SDK: Building Real AI Features Without Fighting the Framework'/><author><name>dityalovers</name><uri>http://www.blogger.com/profile/15543044829406906904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNLyjvmZm5V37zdxhosOw0CT_3jBEke6qajtc_0lFNkhiQgRmpjahNqBLE-rT4CQOGckeuC59-e0_8iOQWwi6GaVYGCo-Y-DLEVAenNxeWFie3rljHUGNIUWUuPWA9-KhmPuKkEkKTr-AB6oqRs4nHp7pN7qscz0NMU-ohN40_00_9-bPV2bxnwoxdEg/s72-w320-h213-c/ChatGPT%20Image%20May%205,%202026,%2001_04_40%20AM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-621548099166743792</id><published>2026-05-05T00:45:00.000+07:00</published><updated>2026-05-05T00:45:16.134+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><title type='text'>Laravel Query Scopes Like a Pro (Clean, Reusable &amp; Powerful Eloquent Queries)</title><content type='html'>&lt;article&gt;
  &lt;header&gt;
    &lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpCRQb3tT-MrNOjY7z-M_MbPXDdLCDxGubsRiwSxlic1zD4bpQxB5RsVfry4JHx5dt8kRYS3FuEr3z8B1hVqTbIfy4lQW6bc1wg5EyKY5ZW0BNT3Qcf7Ea6qd36fSyqqvxafJiMVcH65n6IDdDSg5armMjUwNEKNsChiv-brPNaJZqMVLhz7NgiS9CuQ/s1536/ChatGPT%20Image%20May%205,%202026,%2012_42_12%20AM.png&quot; style=&quot;display: block; padding: 1em 0px; text-align: center;&quot;&gt;&lt;img alt=&quot;Write cleaner, reuseable and powerful eloquent queries&quot; border=&quot;0&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1536&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpCRQb3tT-MrNOjY7z-M_MbPXDdLCDxGubsRiwSxlic1zD4bpQxB5RsVfry4JHx5dt8kRYS3FuEr3z8B1hVqTbIfy4lQW6bc1wg5EyKY5ZW0BNT3Qcf7Ea6qd36fSyqqvxafJiMVcH65n6IDdDSg5armMjUwNEKNsChiv-brPNaJZqMVLhz7NgiS9CuQ/w320-h213/ChatGPT%20Image%20May%205,%202026,%2012_42_12%20AM.png&quot; title=&quot;Laravel Query Scope&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
    &lt;p&gt;
      If your Laravel queries are starting to look messy, repeated, or hard to maintain, you’re not alone. 
      Most projects eventually hit this wall where Eloquent logic is scattered across controllers, services, or even views.
    &lt;/p&gt;
    &lt;p&gt;
      This is exactly where &lt;strong&gt;Query Scopes&lt;/strong&gt; become a game changer. They help you turn repetitive query logic 
      into clean, reusable, and expressive methods.
    &lt;/p&gt;
  &lt;/header&gt;

  &lt;section&gt;
    &lt;h2&gt;Why Query Scopes Matter&lt;/h2&gt;
    &lt;p&gt;Without scopes, your code often looks like this:&lt;/p&gt;

    &lt;pre&gt;&lt;code&gt;$users = User::where(&#39;is_active&#39;, 1)
    -&amp;gt;whereNotNull(&#39;email_verified_at&#39;)
    -&amp;gt;where(&#39;role&#39;, &#39;admin&#39;)
    -&amp;gt;get();&lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;Now imagine repeating similar filters across multiple controllers. That’s when things get:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Hard to maintain&lt;/li&gt;
      &lt;li&gt;Easy to duplicate&lt;/li&gt;
      &lt;li&gt;Difficult to debug&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;
      Query Scopes solve this by centralizing your query logic inside the model.
    &lt;/p&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;What Are Query Scopes in Laravel?&lt;/h2&gt;
    &lt;p&gt;
      Laravel Query Scopes are methods defined inside a model that allow you to reuse query constraints.
    &lt;/p&gt;

    &lt;p&gt;There are two types:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Local Scopes&lt;/li&gt;
      &lt;li&gt;Global Scopes&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;1. Local Scopes (Most Common &amp;amp; Useful)&lt;/h2&gt;
    &lt;p&gt;Local scopes let you define reusable query parts inside a model.&lt;/p&gt;

    &lt;h3&gt;Example: Active Users Scope&lt;/h3&gt;

    &lt;pre&gt;&lt;code&gt;class User extends Model
{
    public function scopeActive($query)
    {
        return $query-&amp;gt;where(&#39;is_active&#39;, 1);
    }
}&lt;/code&gt;&lt;/pre&gt;

    &lt;h3&gt;Usage:&lt;/h3&gt;
    &lt;pre&gt;&lt;code&gt;$users = User::active()-&amp;gt;get();&lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;Now your query becomes:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Cleaner&lt;/li&gt;
      &lt;li&gt;Reusable&lt;/li&gt;
      &lt;li&gt;Easier to read&lt;/li&gt;
    &lt;/ul&gt;

    &lt;h3&gt;Scopes with Parameters&lt;/h3&gt;

    &lt;pre&gt;&lt;code&gt;public function scopeRole($query, $role)
{
    return $query-&amp;gt;where(&#39;role&#39;, $role);
}&lt;/code&gt;&lt;/pre&gt;

    &lt;h3&gt;Usage:&lt;/h3&gt;
    &lt;pre&gt;&lt;code&gt;$admins = User::active()-&amp;gt;role(&#39;admin&#39;)-&amp;gt;get();&lt;/code&gt;&lt;/pre&gt;

    &lt;h3&gt;Real-World Example (Production Style)&lt;/h3&gt;

    &lt;pre&gt;&lt;code&gt;class Order extends Model
{
    public function scopePaid($query)
    {
        return $query-&amp;gt;where(&#39;status&#39;, &#39;paid&#39;);
    }

    public function scopeThisMonth($query)
    {
        return $query-&amp;gt;whereMonth(&#39;created_at&#39;, now()-&amp;gt;month);
    }
}&lt;/code&gt;&lt;/pre&gt;

    &lt;h3&gt;Usage:&lt;/h3&gt;

    &lt;pre&gt;&lt;code&gt;$orders = Order::paid()-&amp;gt;thisMonth()-&amp;gt;get();&lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;This is how clean production queries should look.&lt;/p&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;2. Global Scopes (Automatic Filters)&lt;/h2&gt;
    &lt;p&gt;Global scopes apply automatically to every query.&lt;/p&gt;

    &lt;h3&gt;Example: Only Active Users Everywhere&lt;/h3&gt;

    &lt;pre&gt;&lt;code&gt;use Illuminate\Database\Eloquent\Builder;

class ActiveScope implements \Illuminate\Database\Eloquent\Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder-&amp;gt;where(&#39;is_active&#39;, 1);
    }
}&lt;/code&gt;&lt;/pre&gt;

    &lt;h3&gt;Apply in Model:&lt;/h3&gt;

    &lt;pre&gt;&lt;code&gt;class User extends Model
{
    protected static function booted()
    {
        static::addGlobalScope(new ActiveScope);
    }
}&lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;Now every query automatically filters active users.&lt;/p&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;How Query Scopes Improve Code Quality&lt;/h2&gt;

    &lt;h3&gt;Without scopes:&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;Logic scattered everywhere&lt;/li&gt;
      &lt;li&gt;Hard to refactor&lt;/li&gt;
      &lt;li&gt;Repeated conditions&lt;/li&gt;
    &lt;/ul&gt;

    &lt;h3&gt;With scopes:&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;Centralized logic&lt;/li&gt;
      &lt;li&gt;Cleaner controllers&lt;/li&gt;
      &lt;li&gt;Easier testing&lt;/li&gt;
      &lt;li&gt;Better readability&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;Visual Understanding&lt;/h2&gt;

    &lt;p&gt;&lt;strong&gt;Without Scopes:&lt;/strong&gt;&lt;/p&gt;
    &lt;p&gt;Controller → messy query → repeated logic → hard maintenance&lt;/p&gt;

    &lt;p&gt;&lt;strong&gt;With Scopes:&lt;/strong&gt;&lt;/p&gt;
    &lt;p&gt;Controller → clean call → model handles logic → reusable system&lt;/p&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;Combining Scopes (Power Move)&lt;/h2&gt;

    &lt;pre&gt;&lt;code&gt;User::active()
    -&amp;gt;role(&#39;admin&#39;)
    -&amp;gt;latest()
    -&amp;gt;get();&lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;This is where Laravel Eloquent becomes really expressive.&lt;/p&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;Best Practices&lt;/h2&gt;
    &lt;ul&gt;
      &lt;li&gt;Keep scope logic simple and focused&lt;/li&gt;
      &lt;li&gt;Use meaningful names (active, paid, verified)&lt;/li&gt;
      &lt;li&gt;Avoid heavy business logic inside scopes&lt;/li&gt;
      &lt;li&gt;Combine scopes instead of duplicating queries&lt;/li&gt;
      &lt;li&gt;Prefer local scopes unless global filtering is required&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;

  &lt;footer&gt;
    &lt;h2&gt;Final Thoughts&lt;/h2&gt;
    &lt;p&gt;
      Laravel Query Scopes are one of those features that seem small but dramatically improve code quality when used properly.
    &lt;/p&gt;
    &lt;p&gt;
      Instead of repeating query logic everywhere, you centralize it into reusable building blocks.
    &lt;/p&gt;
    &lt;p&gt;Your Eloquent code becomes:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Cleaner&lt;/li&gt;
      &lt;li&gt;More readable&lt;/li&gt;
      &lt;li&gt;Easier to scale&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;
      And most importantly—far easier to maintain in real-world applications.
    &lt;/p&gt;
  &lt;/footer&gt;
&lt;/article&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/621548099166743792/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2026/05/laravel-query-scopes-like-pro-clean.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/621548099166743792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/621548099166743792'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2026/05/laravel-query-scopes-like-pro-clean.html' title='Laravel Query Scopes Like a Pro (Clean, Reusable &amp; Powerful Eloquent Queries)'/><author><name>dityalovers</name><uri>http://www.blogger.com/profile/15543044829406906904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpCRQb3tT-MrNOjY7z-M_MbPXDdLCDxGubsRiwSxlic1zD4bpQxB5RsVfry4JHx5dt8kRYS3FuEr3z8B1hVqTbIfy4lQW6bc1wg5EyKY5ZW0BNT3Qcf7Ea6qd36fSyqqvxafJiMVcH65n6IDdDSg5armMjUwNEKNsChiv-brPNaJZqMVLhz7NgiS9CuQ/s72-w320-h213-c/ChatGPT%20Image%20May%205,%202026,%2012_42_12%20AM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-4875096864421621632</id><published>2026-05-05T00:31:00.003+07:00</published><updated>2026-05-05T00:34:13.477+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><title type='text'>Understanding the N+1 Problem in Laravel</title><content type='html'>&lt;article&gt;

  &lt;header&gt;
    &lt;p&gt;If you’ve worked with Laravel for a while, you’ve probably heard developers mention the “N+1 problem.”
      It’s one of those issues that quietly hurts performance without obvious errors, making your application slow as data grows.
    &lt;/p&gt;
    &lt;p&gt;
      In this article, we’ll break down what the N+1 problem is, why it happens in Laravel, and how to fix it properly.
    &lt;/p&gt;
  &lt;/header&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0QZTUCv8APca66T0-WCPEqfrhyphenhyphenJezRCIcmHt3Ss2c00RYe_9VKfbxj_yukXPYoOVVvdt46vGBTVAgewaOzjHs18HojPBfMmT_ULxqlCP0jDP-Kj1G5G_enlqmixLDqnSm2N0IbuqdhTv2DXxFpDAD9E77SLHdoGonK3sr-KFtZDfSZ9xPBufp_mEuxQ/s1536/ChatGPT%20Image%20May%205,%202026,%2012_18_45%20AM.png&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;&quot;&gt;&lt;img alt=&quot;Laravel N+1 Problem&quot; border=&quot;0&quot; data-original-height=&quot;1536&quot; data-original-width=&quot;1024&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0QZTUCv8APca66T0-WCPEqfrhyphenhyphenJezRCIcmHt3Ss2c00RYe_9VKfbxj_yukXPYoOVVvdt46vGBTVAgewaOzjHs18HojPBfMmT_ULxqlCP0jDP-Kj1G5G_enlqmixLDqnSm2N0IbuqdhTv2DXxFpDAD9E77SLHdoGonK3sr-KFtZDfSZ9xPBufp_mEuxQ/w213-h320/ChatGPT%20Image%20May%205,%202026,%2012_18_45%20AM.png&quot; title=&quot;Understanding Laravel N+1 Query Problem&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
  &lt;section&gt;
    &lt;h2&gt;What is the N+1 Problem?&lt;/h2&gt;
    &lt;p&gt;The N+1 problem happens when your application executes:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;1 query to retrieve a list of records&lt;/li&gt;
      &lt;li&gt;N additional queries to retrieve related data for each record&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;
      Instead of a single optimized query strategy, you end up with many repeated database calls.
    &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;Simple Example&lt;/h2&gt;
    &lt;p&gt;Imagine you have two models:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;code&gt;Post&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code&gt;Comment&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;Each post has many comments. Now consider this code:&lt;/p&gt;

    &lt;pre&gt;&lt;code&gt;
$posts = Post::all();

foreach ($posts as $post) {
    echo $post-&amp;gt;comments-&amp;gt;count();
}
    &lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;What actually happens:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;1 query: get all posts&lt;/li&gt;
      &lt;li&gt;N queries: get comments for each post&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;
      If you have 100 posts, Laravel executes &lt;strong&gt;101 queries&lt;/strong&gt;.
      That’s the N+1 problem.
    &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;Why It Becomes a Problem&lt;/h2&gt;
    &lt;p&gt;The issue isn’t noticeable with small datasets. But as your application grows:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Database load increases&lt;/li&gt;
      &lt;li&gt;Response time slows down&lt;/li&gt;
      &lt;li&gt;Server resources get wasted&lt;/li&gt;
      &lt;li&gt;API responses become inconsistent under load&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;In production systems, this can become a serious bottleneck.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;How to Detect N+1 in Laravel&lt;/h2&gt;
    &lt;p&gt;You can detect it using query logging or debugging tools.&lt;/p&gt;

    &lt;pre&gt;&lt;code&gt;
DB::enableQueryLog();

// your code here

dd(DB::getQueryLog());
    &lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;Or use tools like:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Laravel Debugbar&lt;/li&gt;
      &lt;li&gt;Telescope&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;The Fix: Eager Loading&lt;/h2&gt;
    &lt;p&gt;
      Laravel provides a solution called &lt;strong&gt;eager loading&lt;/strong&gt;.
      Instead of loading relationships one by one, you load them upfront.
    &lt;/p&gt;

    &lt;h3&gt;Fixed Example&lt;/h3&gt;
    &lt;pre&gt;&lt;code&gt;
$posts = Post::with(&#39;comments&#39;)-&amp;gt;get();

foreach ($posts as $post) {
    echo $post-&amp;gt;comments-&amp;gt;count();
}
    &lt;/code&gt;&lt;/pre&gt;

    &lt;h3&gt;What Changed?&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;1 query for posts&lt;/li&gt;
      &lt;li&gt;1 query for all related comments&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;
      Now Laravel executes only &lt;strong&gt;2 queries total&lt;/strong&gt;, regardless of how many posts exist.
    &lt;/p&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;When You Need Multiple Relationships&lt;/h2&gt;

    &lt;pre&gt;&lt;code&gt;
$posts = Post::with(&#39;comments.user&#39;)-&amp;gt;get();
    &lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;This prevents hidden N+1 issues across nested relationships.&lt;/p&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;Nested Relationships&lt;/h2&gt;
    &lt;p&gt;Laravel also supports deep eager loading:&lt;/p&gt;

    &lt;pre&gt;&lt;code&gt;
$posts = Post::with(&#39;comments.user&#39;)-&amp;gt;get();
    &lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;This loads:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Posts&lt;/li&gt;
      &lt;li&gt;Comments&lt;/li&gt;
      &lt;li&gt;Users of each comment&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;All in optimized queries.&lt;/p&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;Lazy vs Eager Loading&lt;/h2&gt;

    &lt;table border=&quot;1&quot; cellpadding=&quot;8&quot; cellspacing=&quot;0&quot;&gt;
      &lt;thead&gt;
        &lt;tr&gt;
          &lt;th&gt;Type&lt;/th&gt;
          &lt;th&gt;Behavior&lt;/th&gt;
          &lt;th&gt;Performance&lt;/th&gt;
        &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;Lazy Loading&lt;/td&gt;
          &lt;td&gt;Loads relation when accessed&lt;/td&gt;
          &lt;td&gt;Can cause N+1&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Eager Loading&lt;/td&gt;
          &lt;td&gt;Loads upfront&lt;/td&gt;
          &lt;td&gt;Optimized&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/section&gt;

  &lt;section&gt;
    &lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;Best Practices&lt;/h2&gt;
    &lt;ul&gt;
      &lt;li&gt;Always consider relationships when looping data&lt;/li&gt;
      &lt;li&gt;Use &lt;code&gt;with()&lt;/code&gt; for known relationships&lt;/li&gt;
      &lt;li&gt;Avoid accessing relationships inside loops without eager loading&lt;/li&gt;
      &lt;li&gt;Monitor queries during development&lt;/li&gt;
      &lt;li&gt;Use Debugbar or Telescope regularly&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;

  &lt;footer&gt;
    &lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;Final Thoughts&lt;/h2&gt;
    &lt;p&gt;
      The N+1 problem is easy to miss but has a big impact on performance.
      Fortunately, Laravel provides simple tools like eager loading to solve it cleanly.
    &lt;/p&gt;
    &lt;p&gt;
      Once you develop the habit of thinking about database queries early, your applications will scale much more efficiently.
    &lt;/p&gt;
  &lt;/footer&gt;

&lt;/article&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/4875096864421621632/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2026/05/understanding-n1-problem-in-laravel.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/4875096864421621632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/4875096864421621632'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2026/05/understanding-n1-problem-in-laravel.html' title='Understanding the N+1 Problem in Laravel'/><author><name>dityalovers</name><uri>http://www.blogger.com/profile/15543044829406906904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0QZTUCv8APca66T0-WCPEqfrhyphenhyphenJezRCIcmHt3Ss2c00RYe_9VKfbxj_yukXPYoOVVvdt46vGBTVAgewaOzjHs18HojPBfMmT_ULxqlCP0jDP-Kj1G5G_enlqmixLDqnSm2N0IbuqdhTv2DXxFpDAD9E77SLHdoGonK3sr-KFtZDfSZ9xPBufp_mEuxQ/s72-w213-h320-c/ChatGPT%20Image%20May%205,%202026,%2012_18_45%20AM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-8574819354039289910</id><published>2025-10-09T14:56:00.004+07:00</published><updated>2025-10-09T14:56:57.159+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Filament dashboard"/><category scheme="http://www.blogger.com/atom/ns#" term="Filament PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="Filament tutorial"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel 2025"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel admin panel"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel CMS"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel CRUD generator"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel Filament"/><title type='text'>Laravel Filament: The Best Admin Panel for Laravel Developers in 2025</title><content type='html'>&lt;h2 data-end=&quot;572&quot; data-start=&quot;544&quot;&gt;What Is Laravel Filament?&lt;/h2&gt;&lt;p data-end=&quot;879&quot; data-start=&quot;574&quot;&gt;Laravel Filament is a modern admin panel and form builder designed for Laravel developers who want to create professional, data-driven dashboards without the complexity of front-end frameworks. It runs on Livewire and Alpine.js, making it fully reactive and interactive while remaining purely PHP-based.&lt;/p&gt;&lt;p data-end=&quot;1114&quot; data-start=&quot;881&quot;&gt;With Filament, developers can manage database records, create dynamic forms, and design elegant back-office systems in minutes. It is widely adopted because it offers both simplicity and flexibility for building administrative tools.&lt;/p&gt;&lt;hr data-end=&quot;1119&quot; data-start=&quot;1116&quot; /&gt;&lt;h2 data-end=&quot;1156&quot; data-start=&quot;1121&quot;&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2 data-end=&quot;1156&quot; data-start=&quot;1121&quot;&gt;Key Features of Laravel Filament&lt;/h2&gt;&lt;p data-end=&quot;1391&quot; data-start=&quot;1158&quot;&gt;Laravel Filament provides a clean, Tailwind CSS-based interface that looks professional and works beautifully on all screen sizes. Its design is minimal and consistent, which allows developers to focus on logic rather than styling.&lt;/p&gt;&lt;p data-end=&quot;1764&quot; data-start=&quot;1393&quot;&gt;One of its most appealing features is its one-line CRUD generation. By using a single command—&lt;code data-end=&quot;1523&quot; data-start=&quot;1487&quot;&gt;php artisan make:filament-resource&lt;/code&gt;—developers can instantly generate listing pages, create and edit forms, and delete functionalities. Each resource comes with built-in search, sorting, and pagination options, which can be customized with straightforward PHP configuration.&lt;/p&gt;&lt;p data-end=&quot;2112&quot; data-start=&quot;1766&quot;&gt;The Filament ecosystem continues to expand through community-driven plugins. These include Filament Shield for managing user roles and permissions, Media Library integration for handling file uploads, and powerful dashboard widgets for analytics. Developers can extend functionality easily without touching JavaScript or complex configurations.&lt;/p&gt;&lt;p data-end=&quot;2374&quot; data-start=&quot;2114&quot;&gt;Filament also supports role-based access control by integrating seamlessly with Spatie Roles and Permissions. This makes it easy to assign specific permissions to administrators, editors, and general users, ensuring that sensitive data is properly protected.&lt;/p&gt;&lt;p data-end=&quot;2678&quot; data-start=&quot;2376&quot;&gt;Another major strength of Filament is its developer-first philosophy. Everything is configured through PHP, which aligns perfectly with Laravel’s design patterns. Relationships, validation, and component reuse are all intuitive. The framework prioritizes productivity, maintainability, and performance.&lt;/p&gt;&lt;hr data-end=&quot;2683&quot; data-start=&quot;2680&quot; /&gt;&lt;h2 data-end=&quot;2722&quot; data-start=&quot;2685&quot;&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2 data-end=&quot;2722&quot; data-start=&quot;2685&quot;&gt;Example: Building a Blog Dashboard&lt;/h2&gt;&lt;p data-end=&quot;3116&quot; data-start=&quot;2724&quot;&gt;Creating a blog management system with Filament is simple. You can generate a new resource for blog posts using an Artisan command. Once the resource is created, defining the form fields—such as title, content, and publication status—can be done directly within the resource file. Filament automatically generates the necessary pages for listing, creating, editing, and deleting blog posts.&lt;/p&gt;&lt;p data-end=&quot;3332&quot; data-start=&quot;3118&quot;&gt;Within minutes, developers can have a fully functional content management system without writing front-end code. Every page is responsive and styled automatically, making it suitable for production use immediately.&lt;/p&gt;&lt;hr data-end=&quot;3337&quot; data-start=&quot;3334&quot; /&gt;&lt;h2 data-end=&quot;3380&quot; data-start=&quot;3339&quot;&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2 data-end=&quot;3380&quot; data-start=&quot;3339&quot;&gt;The Laravel Filament Ecosystem in 2025&lt;/h2&gt;&lt;p data-end=&quot;3668&quot; data-start=&quot;3382&quot;&gt;As of 2025, Filament has grown beyond a standard admin panel. It now includes standalone packages like Filament Forms and Filament Tables, which can be integrated into any Laravel project. There are also official tools for notifications, no-code page building, and plugin development.&lt;/p&gt;&lt;p data-end=&quot;3878&quot; data-start=&quot;3670&quot;&gt;The Filament community is active and continues to contribute new features, extensions, and tutorials. This growing ecosystem ensures that Filament remains relevant and future-proof for modern web development.&lt;/p&gt;&lt;hr data-end=&quot;3883&quot; data-start=&quot;3880&quot; /&gt;&lt;h2 data-end=&quot;3919&quot; data-start=&quot;3885&quot;&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2 data-end=&quot;3919&quot; data-start=&quot;3885&quot;&gt;How to Install Laravel Filament&lt;/h2&gt;&lt;p data-end=&quot;4070&quot; data-start=&quot;3921&quot;&gt;Installing Filament is simple and beginner-friendly. Developers can install it via Composer and create their first admin user using Artisan commands:&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-end=&quot;4145&quot; data-start=&quot;4072&quot;&gt;&lt;div class=&quot;contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary&quot;&gt;&lt;div class=&quot;sticky top-9&quot;&gt;&lt;div class=&quot;absolute end-0 bottom-0 flex h-9 items-center pe-2&quot;&gt;&lt;div class=&quot;bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;overflow-y-auto p-4&quot; dir=&quot;ltr&quot;&gt;&lt;code class=&quot;whitespace-pre!&quot;&gt;composer require filament/filament
php artisan make:filament-user
&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p data-end=&quot;4332&quot; data-start=&quot;4147&quot;&gt;After installation, you can visit the &lt;code data-end=&quot;4193&quot; data-start=&quot;4185&quot;&gt;/admin&lt;/code&gt; route in your browser to access your dashboard. From there, you can start creating resources and managing your application data instantly.&lt;/p&gt;&lt;hr data-end=&quot;4337&quot; data-start=&quot;4334&quot; /&gt;&lt;h2 data-end=&quot;4392&quot; data-start=&quot;4339&quot;&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2 data-end=&quot;4392&quot; data-start=&quot;4339&quot;&gt;Why Laravel Filament Is the Future of Admin Panels&lt;/h2&gt;&lt;p data-end=&quot;4658&quot; data-start=&quot;4394&quot;&gt;Laravel Filament combines speed, flexibility, and modern design in a way that no other Laravel admin panel does. It allows developers to create polished dashboards for a variety of applications such as blogs, business tools, analytics panels, and SaaS platforms.&lt;/p&gt;&lt;p data-end=&quot;4950&quot; data-start=&quot;4660&quot;&gt;It reduces development time significantly and provides a strong foundation for teams that value maintainability and scalability. Filament’s consistent syntax, excellent documentation, and active community make it a smart choice for any Laravel developer looking to modernize their workflow.&lt;/p&gt;&lt;p&gt;


























&lt;/p&gt;&lt;p data-end=&quot;5055&quot; data-start=&quot;4952&quot;&gt;For more information, visit the official website at &lt;a class=&quot;decorated-link cursor-pointer&quot; data-end=&quot;5054&quot; data-start=&quot;5004&quot; rel=&quot;noopener&quot; target=&quot;_new&quot;&gt;https://filamentphp.com&lt;span aria-hidden=&quot;true&quot; class=&quot;ms-0.5 inline-block align-middle leading-none&quot;&gt;&lt;svg class=&quot;block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]&quot; data-rtl-flip=&quot;&quot; fill=&quot;currentColor&quot; height=&quot;20&quot; viewbox=&quot;0 0 20 20&quot; width=&quot;20&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M14.3349 13.3301V6.60645L5.47065 15.4707C5.21095 15.7304 4.78895 15.7304 4.52925 15.4707C4.26955 15.211 4.26955 14.789 4.52925 14.5293L13.3935 5.66504H6.66011C6.29284 5.66504 5.99507 5.36727 5.99507 5C5.99507 4.63273 6.29284 4.33496 6.66011 4.33496H14.9999L15.1337 4.34863C15.4369 4.41057 15.665 4.67857 15.665 5V13.3301C15.6649 13.6973 15.3672 13.9951 14.9999 13.9951C14.6327 13.9951 14.335 13.6973 14.3349 13.3301Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/8574819354039289910/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2025/10/laravel-filament-best-admin-panel-for.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/8574819354039289910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/8574819354039289910'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2025/10/laravel-filament-best-admin-panel-for.html' title='Laravel Filament: The Best Admin Panel for Laravel Developers in 2025'/><author><name>dityalovers</name><uri>http://www.blogger.com/profile/15543044829406906904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-8760354364794005263</id><published>2020-11-08T22:56:00.000+07:00</published><updated>2020-11-08T22:56:29.784+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>Laravel 8 Jetstream Livewire + Blade</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGxx7yVnxjJJ5-smre6ANNZ11DyYfULKgNTMKHjBtvJcVUq4HAy_nAhg-Mg8B_OQ95BbBULaOvBfKE8cxwJOl9mp5W9VeVmftj5BVSUg3qR4QR7xw8SricGIQtfUG1WSltywE5AKlQYTMs/s1600/Laravel_logo.png&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;232&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGxx7yVnxjJJ5-smre6ANNZ11DyYfULKgNTMKHjBtvJcVUq4HAy_nAhg-Mg8B_OQ95BbBULaOvBfKE8cxwJOl9mp5W9VeVmftj5BVSUg3qR4QR7xw8SricGIQtfUG1WSltywE5AKlQYTMs/s320/Laravel_logo.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;Salah satu fitur baru&amp;nbsp;&lt;b&gt;Laravel &lt;/b&gt;versi &lt;b&gt;8&lt;/b&gt; adalah &lt;b&gt;Laravel Jetstream&lt;/b&gt;. Laravel Jetstream menggantikan &lt;i&gt;scafolding&lt;/i&gt;&amp;nbsp;&lt;i&gt;built in &lt;/i&gt;otentifikasi&amp;nbsp;laravel yang lama, dilengkapi dengan fitur &lt;i&gt;two factor authentification (2FA)&lt;/i&gt;&amp;nbsp;dan &lt;i&gt;session management&lt;/i&gt;&amp;nbsp;(berguna untuk menghapus &lt;i&gt;session &lt;/i&gt;yang aktif&lt;i&gt;&amp;nbsp;&lt;/i&gt;jika melakukan&amp;nbsp;login di &lt;i&gt;browser&lt;/i&gt; yang berbeda) serta dilengkapi dukungan API &lt;a href=&quot;https://github.com/laravel/sanctum&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Laravel Sanctum&lt;/a&gt;. Laravel jetstream mendukung 2 &lt;i&gt;stack &lt;/i&gt;teknologi dalam implementasinya, bisa menggunakan &lt;b&gt;&lt;i&gt;Liveware + Blade&lt;/i&gt;&lt;/b&gt; atau &lt;b&gt;&lt;i&gt;Inertia.js + Vue&lt;/i&gt;&lt;/b&gt;. Pada tutorial ini kita akan mencoba menggunakan Livewire + Blade, untuk dapat menginstall laravel 8 dibutuhkan php versi 7.3+ beserta ekstensi php yg dibutuhkan laravel, node js dan npm (node package manager), selengkapnya dapat dibaca pada halaman &lt;a href=&quot;https://laravel.com/docs/8.x#server-requirements&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;dokumentasi instalasi laravel&lt;/a&gt;.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4 style=&quot;text-align: justify;&quot;&gt;Buat Database Baru (MySQL)&lt;/h4&gt;&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;# Buat database baru menggunakan mysql dengan nama database jetstream
$ mysql -uroot -p
# Masukan root password mysql
mysql&amp;gt; create database jetstream;
mysql&amp;gt; exit
&lt;/pre&gt;&lt;br /&gt;&lt;h4 style=&quot;text-align: justify;&quot;&gt;Instalasi Jetstream&lt;/h4&gt;&lt;div&gt;Untuk menggunakan fitur jetstream, gunakan argumen --jet setelah nama project. Tutorial ini menggunakan nama project &quot;jetstream&quot; untuk nama project laravelnya.&lt;/div&gt;&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ laravel new jetstream --jet
&amp;gt; 0 (Untuk livewire)
&amp;gt; no (Jika aplikasi tidak digunakan untuk tim)
$ cd jetstream
$ npm install &amp;amp;&amp;amp; npm run dev
# Buka file .env di root aplikasi dan konfigurasi username, password dan nama database
DB_DATABASE=jetstream
DB_USERNAME=root
DB_PASSWORD=&amp;lt;MYSQL_PASSWORD&amp;gt;
$ php artisan migrate
$ php artisan serve
# Buka browser ketikkan alamat url localhost:8000
&lt;/pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1lTvp3tRw8ujghAjRq2FDyInxQ-Gs4exxSn3tIPQQ_na0q1MOWMcS4KI5bHTBABYOVgGCOOsWQcvhPvJAxIxeaoiOHLCL8bkaqjSKaqlZHultgmCcm69X17i9p_pQqfztGu3LgMwQsY_t/s798/Screen+Shot+2020-11-08+at+20.44.01.png&quot;&gt;&lt;img alt=&quot;Instalasi Jetstream Laravel&quot; border=&quot;0&quot; data-original-height=&quot;798&quot; data-original-width=&quot;461&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1lTvp3tRw8ujghAjRq2FDyInxQ-Gs4exxSn3tIPQQ_na0q1MOWMcS4KI5bHTBABYOVgGCOOsWQcvhPvJAxIxeaoiOHLCL8bkaqjSKaqlZHultgmCcm69X17i9p_pQqfztGu3LgMwQsY_t/s16000/Screen+Shot+2020-11-08+at+20.44.01.png&quot; title=&quot;Instalasi Jetstream Laravel&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi56xDuO6oW_-tYr9b-VIlW6dA9P4Gyv5_fZeVjUjJo51fwj3wEdQAC7LXh_N4PvcDS-IWPslfzi6cPaNpBt-X5MfBxq7yJS-4ClbaaAaJO06hAwxTtasCadEsFBK9M5FnosPHqaLKkcz8p/s1280/Screen+Shot+2020-11-08+at+21.20.23.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Laravel Jetstream on Valet&quot; border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;1280&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi56xDuO6oW_-tYr9b-VIlW6dA9P4Gyv5_fZeVjUjJo51fwj3wEdQAC7LXh_N4PvcDS-IWPslfzi6cPaNpBt-X5MfBxq7yJS-4ClbaaAaJO06hAwxTtasCadEsFBK9M5FnosPHqaLKkcz8p/w640-h400/Screen+Shot+2020-11-08+at+21.20.23.png&quot; title=&quot;Laravel Jetstream on Valet&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;Laravel Jetstream running on Valet&lt;br /&gt;&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji4VQMQ9vbDh6xiJIl83xLR8Eu1oygGM3OqVYiIE7TyRublnVNnx6_hmYlECt9RHvz_iJZoG3sBSmh_HBcJGjqnWX24r6qCxgQe7HGQnCWu7HEb824Njj_PZNTMNDecqQ7ZbbhcScusUxY/s1280/Screen+Shot+2020-11-08+at+21.26.58.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Registrasi User Baru&quot; border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;1280&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji4VQMQ9vbDh6xiJIl83xLR8Eu1oygGM3OqVYiIE7TyRublnVNnx6_hmYlECt9RHvz_iJZoG3sBSmh_HBcJGjqnWX24r6qCxgQe7HGQnCWu7HEb824Njj_PZNTMNDecqQ7ZbbhcScusUxY/w640-h400/Screen+Shot+2020-11-08+at+21.26.58.png&quot; title=&quot;Registrasi User Baru&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;Registrasi User Baru&lt;br /&gt;&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVhNh8a9D79hecaPSI_j_Js7reMmLFgialZHrzeGtvUQVnzWCr2UXcrr4pQ0gm4HsvAlHIsGjnagxtDSplXus2pI7fWEgdqYqa9tblhmEK1qfjum2TYmdfqgzK8xpxIF3yS50N1uEc-Pnh/s1280/Screen+Shot+2020-11-08+at+21.25.50.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Halaman Dashboard Jetstream&quot; border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;1280&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVhNh8a9D79hecaPSI_j_Js7reMmLFgialZHrzeGtvUQVnzWCr2UXcrr4pQ0gm4HsvAlHIsGjnagxtDSplXus2pI7fWEgdqYqa9tblhmEK1qfjum2TYmdfqgzK8xpxIF3yS50N1uEc-Pnh/w640-h400/Screen+Shot+2020-11-08+at+21.25.50.png&quot; title=&quot;Halaman Dashboard Jetstream&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;Halaman Dashboard Jetstream&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTrhMhtoalp6B_zslu_CL5DfW87SfNIYHqc7vsIVVn-AaXtENPtPXOoYRCsUJ1UyhsKPQrPBIdKCBI-xo5GQ1TJdp1ta_QHoL4CEMr9wMWJzUetBZFP4O6SPCP9nRs9EGLLUxRO96vkEh3/s1280/Screen+Shot+2020-11-08+at+21.27.41.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Browser Session Management&quot; border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;1280&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTrhMhtoalp6B_zslu_CL5DfW87SfNIYHqc7vsIVVn-AaXtENPtPXOoYRCsUJ1UyhsKPQrPBIdKCBI-xo5GQ1TJdp1ta_QHoL4CEMr9wMWJzUetBZFP4O6SPCP9nRs9EGLLUxRO96vkEh3/w640-h400/Screen+Shot+2020-11-08+at+21.27.41.png&quot; title=&quot;Browser Session Management&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;Browser Session Management&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9xlTBn_t3PCXzZCnranQ17-thXhGff_uMrNbCB3f6BCOftDvVi1HWP3KpixzqJTDHfojWUKoqkjcsfyP9s7OTdoVty5MjGB9LTTkZcYD2qs29MqluVOpr5GSaVWiaE8MTzSFxEYE4yJov/s1280/Screen+Shot+2020-11-08+at+21.29.58.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Enable Two Factor Authentification&quot; border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;1280&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9xlTBn_t3PCXzZCnranQ17-thXhGff_uMrNbCB3f6BCOftDvVi1HWP3KpixzqJTDHfojWUKoqkjcsfyP9s7OTdoVty5MjGB9LTTkZcYD2qs29MqluVOpr5GSaVWiaE8MTzSFxEYE4yJov/w640-h400/Screen+Shot+2020-11-08+at+21.29.58.png&quot; title=&quot;Enable Two Factor Authentification&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;Enable Two Factor Authentification&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-zpLoyumzzNyVawByVDkFVZ3ex1cyxW-YKJCTz0-a34esMKrskdIoNnyCS-6UiGO54_MP3ChUijSt85eb0zSPi6XrqvkzE8hKwE2YTjX1br6cZtF37JH70sBuo1V8Y2r-5tBUE17-et2/s1280/Screen+Shot+2020-11-08+at+21.36.18.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Two Authentification Challenge On Login&quot; border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;1280&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-zpLoyumzzNyVawByVDkFVZ3ex1cyxW-YKJCTz0-a34esMKrskdIoNnyCS-6UiGO54_MP3ChUijSt85eb0zSPi6XrqvkzE8hKwE2YTjX1br6cZtF37JH70sBuo1V8Y2r-5tBUE17-et2/w640-h400/Screen+Shot+2020-11-08+at+21.36.18.png&quot; title=&quot;Two Authentification Challenge On Login&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot;&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;i&gt;Two Authentification Challenge On Login&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;h4 style=&quot;text-align: justify;&quot;&gt;Struktur Jetstream&lt;/h4&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Views / Pages&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Jika menggunakan Livewire views terletak pada direktori resources/views, jika menggunakan Inertia views terletak pada direktori resources/js/Pages&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Dashboard (Halaman Utama)&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;View halaman utama / dashboard terletak pada direktori resources/views/dashboard.blade.php jika menggunakan Livewire dan resoureces/js/Pages/Dashboard.vue jika menggunakan Inertia&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Actions&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Aksi / &lt;i&gt;actions&lt;/i&gt;&amp;nbsp;class terdapat pada direktori &lt;i&gt;&lt;b&gt;app/Actions&lt;/b&gt;. &lt;/i&gt;Class pada direktori ini merupakan bawaan laravel yg terdiri dari 2 component &lt;i style=&quot;font-weight: bold;&quot;&gt;Fortify &lt;/i&gt;dan &lt;b style=&quot;font-style: italic;&quot;&gt;Jetstream&lt;/b&gt;. Aksi standar contohnya untuk membuat user baru, update password, update profil dan menghapus user.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Tailwind&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Tailwind digunakan untuk melakukan kompilasi CSS atau assets aplikasi. File konfigurasi tailwind terletak pada &lt;b&gt;&lt;i&gt;tailwind.config.js&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Livewire Component&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Jetstream menggunakan berbagai macam komponen blade seperti button atau modal untuk mendukung teknologi Liverwire. Kita dapat &lt;i&gt;publish&lt;/i&gt; komponen Livewire supaya dapat dikustomisasi tampilannya dengan menggunakan &lt;i&gt;artisan command&amp;nbsp;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;php artisan vendor:publish --tag=jetstream-views&lt;/pre&gt;&lt;br /&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;
Mengganti Logo Aplikasi&lt;/h4&gt;&lt;div&gt;Jetstream menggunakan svg untuk logo pada aplikasi baik pada halaman otentifikasi ataupun pada &lt;i&gt;navbar &lt;/i&gt;aplikasi. Untuk dapat mengganti &lt;i&gt;custom&lt;/i&gt; logo aplikasi, ubahlah file-file berikut :&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;resources/views/vendor/jetstream/components/application-logo.blade.php&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;&lt;b style=&quot;font-style: normal;&quot;&gt;&lt;i&gt;resources/views/vendor/jetstream/components/authentification-card-logo.blade.php&lt;/i&gt;&lt;/b&gt;&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;&lt;b style=&quot;font-style: normal;&quot;&gt;&lt;i&gt;&lt;b style=&quot;font-style: normal;&quot;&gt;&lt;i&gt;resources/views/vendor/jetstream/components/application-mark.blade.php&lt;/i&gt;&lt;/b&gt;&lt;/i&gt;&lt;/b&gt;&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;
Contoh script ganti logo aplikasi (resources/views/vendor/jetstream/components/application-logo.blade.php) &lt;br /&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/14af030638b271493024d192179528f6.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5ic_Ix6AEwHDnv0pv0gmpL-yyNJmaU6_w3g4Ksk92yRVptnkJ69VAI8Z_7kzf4u60r9ylgpkGkCAEzAZDOOnRn1Eq15GVhM0qI9CiefAU8aH4bZhJXsoCSDKdp-e15zEcblHp3maQhxH9/s1280/Screen+Shot+2020-11-08+at+22.43.38.png&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; padding: 1em 0px; text-align: center;&quot;&gt;&lt;img alt=&quot;Ganti Logo Aplikasi Jetstream (SVG)&quot; border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;1280&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5ic_Ix6AEwHDnv0pv0gmpL-yyNJmaU6_w3g4Ksk92yRVptnkJ69VAI8Z_7kzf4u60r9ylgpkGkCAEzAZDOOnRn1Eq15GVhM0qI9CiefAU8aH4bZhJXsoCSDKdp-e15zEcblHp3maQhxH9/w640-h400/Screen+Shot+2020-11-08+at+22.43.38.png&quot; title=&quot;Ganti Logo Aplikasi Jetstream (SVG)&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;Ganti Logo Aplikasi Jetstream (SVG)&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/8760354364794005263/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2020/11/laravel-8-jetstream-livewire-blade.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/8760354364794005263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/8760354364794005263'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2020/11/laravel-8-jetstream-livewire-blade.html' title='Laravel 8 Jetstream Livewire + Blade'/><author><name>dityalovers</name><uri>http://www.blogger.com/profile/15543044829406906904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGxx7yVnxjJJ5-smre6ANNZ11DyYfULKgNTMKHjBtvJcVUq4HAy_nAhg-Mg8B_OQ95BbBULaOvBfKE8cxwJOl9mp5W9VeVmftj5BVSUg3qR4QR7xw8SricGIQtfUG1WSltywE5AKlQYTMs/s72-c/Laravel_logo.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-2456174929514898096</id><published>2020-11-03T00:16:00.000+07:00</published><updated>2020-11-03T00:16:27.695+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cydia"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="Jailbreak"/><title type='text'>Install BRImo pada iPhone yang di Jailbreak</title><content type='html'>&lt;div style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;i&gt;&lt;blockquote&gt;This device does not meet minimum security requirements for this application&lt;/blockquote&gt;&lt;/i&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq34876Mhy7aQGUI5GneVEAobOSdt-DvUlAIItJrNI-9xPc21tPj1UkA3Ew0sM-45w0IrHBMpWSkkmac7YttC39VZXPYsNn-unFwa3emd6CJRKxYyrqABbUX2KcmNslibpWzkSljk1tfXI/s1280/WhatsApp+Image+2020-11-02+at+17.39.15.jpeg&quot; style=&quot;clear: left; display: inline; float: left; margin-bottom: 1em; margin-right: 1em; padding: 1em 0px; text-align: center;&quot;&gt;&lt;img alt=&quot;BRImo device doesnt meet minimum security requirements&quot; border=&quot;0&quot; data-original-height=&quot;1280&quot; data-original-width=&quot;720&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq34876Mhy7aQGUI5GneVEAobOSdt-DvUlAIItJrNI-9xPc21tPj1UkA3Ew0sM-45w0IrHBMpWSkkmac7YttC39VZXPYsNn-unFwa3emd6CJRKxYyrqABbUX2KcmNslibpWzkSljk1tfXI/w180-h320/WhatsApp+Image+2020-11-02+at+17.39.15.jpeg&quot; title=&quot;BRImo device doesnt meet minimum security requirements&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;i&gt;Yes&lt;/i&gt;, bahkan &lt;i&gt;tweak &lt;/i&gt;sekelas &lt;i&gt;&lt;b&gt;xCon&lt;/b&gt;&lt;/i&gt; sama &lt;b style=&quot;font-style: italic;&quot;&gt;Liberty Lite &lt;/b&gt;juga tidak mampu mem&lt;i&gt;bypass&lt;/i&gt; &lt;i&gt;jailbreak detection&lt;/i&gt; BRImo. Berbagai macam&amp;nbsp;&lt;i&gt;tweak bypass detection&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;di Cydia sudah dicoba tapi hasilnya nihil. Setelah sekian lama menggunakan aplikasi BRI Mobile yang pake token SMS, anehnya hanya di iPhone saja yang menggunakan token SMS, aplikasi BRI Mobile di android tidak menggunakan &lt;strike&gt;token SMS&lt;/strike&gt;💩. BRImo menurut saya cocoklah untuk kaum milenial 😁&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Salah satu alasan kenapa masih mempertahankan &lt;i&gt;jailbreak&lt;/i&gt;&amp;nbsp;menurut pandangan saya adalah kita bisa mendapatkan akses &lt;i&gt;full&lt;/i&gt;&amp;nbsp;(root) terhadap iPhone atau iDevice kita tanpa ada batasan dari penyedia sistem operasi.&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;blockquote style=&quot;text-align: center;&quot;&gt;&quot;&lt;i&gt;my own phone is my own rule&lt;/i&gt;&quot;&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Bagi pengguna iOS 14.0.x kebawah dapat melakukan &lt;i&gt;jailbreak &lt;/i&gt;dengan menggunakan &lt;i&gt;software &lt;/i&gt;&lt;a href=&quot;https://checkra.in/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;checkra1n&lt;/a&gt;. Berikut ini adalah cara untuk menginstall BRImo dengan menggunakan &lt;i&gt;tweak &lt;/i&gt;&lt;b&gt;AppStore++ &lt;/b&gt;by &lt;b&gt;CokePokes&lt;/b&gt;. Dengan bantuan tweak ini, kita dapat melakukan instalasi &lt;i&gt;upgrade&lt;/i&gt; / &lt;i&gt;downgrade&lt;/i&gt; versi aplikasi di AppStore. Jadi supaya bisa lancar aplikasi BRIMo silahkan &lt;i&gt;downgrade&lt;/i&gt; ke versi &lt;b&gt;1.3.x (&lt;i&gt;DWYOR&lt;/i&gt;)&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Pastikan Cydia sudah terinstall di iPhone, buka &lt;b&gt;Cydia&lt;/b&gt;, pilih tab menu &lt;b&gt;Sources&lt;/b&gt;, tap &lt;b&gt;edit&lt;/b&gt; kemudian tap &lt;b&gt;add&lt;/b&gt;, ketikan alamat repo berikut lalu tap &lt;b&gt;Add Source&lt;/b&gt;:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class=&quot;brush: plain; toolbar:&#39;false&#39;; filename: &#39;Repo Cydia&#39;&quot; style=&quot;margin: 0px;&quot;&gt;https://rejail.ru/&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfRtdEfal0p3GXbw5BbUFetYrWcxvAEcUGs9BdyA1Qk6r2CuSG_6-awWKMam6V5Da0AbTKYveIIftZWRTJoP3CiLhUritHYX7nBZF7ENFb7hVHZTHuO2Mj4WJIvqqkwgntEbZgBv4Odq_F/s1280/WhatsApp+Image+2020-11-02+at+17.40.27.jpeg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Tambah Repo di Cydia&quot; border=&quot;0&quot; data-original-height=&quot;1280&quot; data-original-width=&quot;720&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfRtdEfal0p3GXbw5BbUFetYrWcxvAEcUGs9BdyA1Qk6r2CuSG_6-awWKMam6V5Da0AbTKYveIIftZWRTJoP3CiLhUritHYX7nBZF7ENFb7hVHZTHuO2Mj4WJIvqqkwgntEbZgBv4Odq_F/w180-h320/WhatsApp+Image+2020-11-02+at+17.40.27.jpeg&quot; title=&quot;Tambah Repo di Cydia&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;Tambah Repo Baru di Cydia&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjEUbqlHZOEQHZcHfArS4tmOBiGB-zsmPnReViQZ26ItporKD02pXBPZrKT6SXKWV74tg4PTujakEf-U_raFmK6UQUOU7gL941smrNsLKRBbe6N1VhYkZjKUU9o-beX072h__jKk0up9Yo/s1280/WhatsApp+Image+2020-11-02+at+17.40.27+%25281%2529.jpeg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Updating sources Cydia&quot; border=&quot;0&quot; data-original-height=&quot;1280&quot; data-original-width=&quot;720&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjEUbqlHZOEQHZcHfArS4tmOBiGB-zsmPnReViQZ26ItporKD02pXBPZrKT6SXKWV74tg4PTujakEf-U_raFmK6UQUOU7gL941smrNsLKRBbe6N1VhYkZjKUU9o-beX072h__jKk0up9Yo/w180-h320/WhatsApp+Image+2020-11-02+at+17.40.27+%25281%2529.jpeg&quot; title=&quot;Updating sources Cydia&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;Update Repository Sources&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;Setelah berhasil menambahkan repo, pilih tab menu &lt;/span&gt;&lt;b style=&quot;text-align: justify;&quot;&gt;Search&lt;/b&gt;&lt;span style=&quot;text-align: justify;&quot;&gt; cari &lt;/span&gt;&lt;i style=&quot;text-align: justify;&quot;&gt;tweak&amp;nbsp;&lt;/i&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;dengan nama &lt;/span&gt;&lt;b style=&quot;text-align: justify;&quot;&gt;AppStore++&lt;/b&gt;&lt;span style=&quot;text-align: justify;&quot;&gt; dari repo &lt;/span&gt;&lt;b style=&quot;text-align: justify;&quot;&gt;rejail.ru&lt;/b&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;, kemudian &lt;/span&gt;&lt;b style=&quot;text-align: justify;&quot;&gt;install&lt;/b&gt;&lt;span style=&quot;text-align: justify;&quot;&gt; &lt;/span&gt;&lt;i style=&quot;text-align: justify;&quot;&gt;tweak, &lt;/i&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;setelah berhasil install, device akan melakukan &lt;/span&gt;&lt;i style=&quot;text-align: justify;&quot;&gt;restart springboard&lt;/i&gt;&lt;span style=&quot;text-align: justify;&quot;&gt; (&lt;/span&gt;&lt;i style=&quot;text-align: justify;&quot;&gt;respring&lt;/i&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;).&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjldY2p51vKzYLLafRvEx3RP6ZO-L2qRaEI3jt7ega8mVHRIKm74Lbc0vULnNwBBRAJj3jQs30OPNVPdCflsNivfAgtnpAB9dNcvvLb1ZYdj_XDlhwAEYTNK5olT1Su8pzHgckLI14OowxL/s1280/WhatsApp+Image+2020-11-02+at+17.40.26.jpeg&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;img alt=&quot;AppStore++&quot; border=&quot;0&quot; data-original-height=&quot;1280&quot; data-original-width=&quot;720&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjldY2p51vKzYLLafRvEx3RP6ZO-L2qRaEI3jt7ega8mVHRIKm74Lbc0vULnNwBBRAJj3jQs30OPNVPdCflsNivfAgtnpAB9dNcvvLb1ZYdj_XDlhwAEYTNK5olT1Su8pzHgckLI14OowxL/w180-h320/WhatsApp+Image+2020-11-02+at+17.40.26.jpeg&quot; title=&quot;AppStore++ Tweak&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;AppStore++ Tweak&lt;/i&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: right;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Buka &lt;b&gt;App Store&lt;/b&gt;, cari aplikasi &lt;b&gt;BRImo&lt;/b&gt;, &lt;b&gt;tap dan hold&lt;/b&gt; pada tombol &lt;b&gt;&lt;i&gt;install/update&lt;/i&gt;&lt;/b&gt;, maka akan muncul popup, pilih &lt;b&gt;Upgrade / Downgrade&lt;/b&gt; kemudian pilih versi aplikasi &lt;b&gt;1.3.3&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7tuFFzKkqT8YCZdbbXYcWpkN-tRKC_ByDxm_R-aE8iW0bNfBzFi_QaLJfhoXyZbYjD6XSue77MtBM5ZyxgAgtLmxr28n0YV84OmnQB75UhKgiejqqKPL7oZOZmy0Y7i3X4b9MTGLEHHwl/s1280/WhatsApp+Image+2020-11-02+at+17.40.28.jpeg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1280&quot; data-original-width=&quot;720&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7tuFFzKkqT8YCZdbbXYcWpkN-tRKC_ByDxm_R-aE8iW0bNfBzFi_QaLJfhoXyZbYjD6XSue77MtBM5ZyxgAgtLmxr28n0YV84OmnQB75UhKgiejqqKPL7oZOZmy0Y7i3X4b9MTGLEHHwl/s320/WhatsApp+Image+2020-11-02+at+17.40.28.jpeg&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;Pilih Versi Aplikasi&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR1GCzKNRpFAUTNvT16dX0a4qSDnWGeYtaDmfoClaBNARDWKDkdjOeXjY_EpxUBrKx8JPlAf2COn2ZmyPNOWViDgfN7TKpJaiFZmYgIUYqLlkIoPwjmtxlxJ-m-pcaDxGWlQgb5v8Rm4a-/s1280/WhatsApp+Image+2020-11-02+at+17.40.51.jpeg&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;BRImo Login&quot; border=&quot;0&quot; data-original-height=&quot;1280&quot; data-original-width=&quot;720&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR1GCzKNRpFAUTNvT16dX0a4qSDnWGeYtaDmfoClaBNARDWKDkdjOeXjY_EpxUBrKx8JPlAf2COn2ZmyPNOWViDgfN7TKpJaiFZmYgIUYqLlkIoPwjmtxlxJ-m-pcaDxGWlQgb5v8Rm4a-/w180-h320/WhatsApp+Image+2020-11-02+at+17.40.51.jpeg&quot; title=&quot;BRImo Login&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i style=&quot;text-align: justify;&quot;&gt;Annoying popup sudah hilang 😝&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: right;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/2456174929514898096/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2020/11/install-brimo-pada-iphone-yang-di.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/2456174929514898096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/2456174929514898096'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2020/11/install-brimo-pada-iphone-yang-di.html' title='Install BRImo pada iPhone yang di Jailbreak'/><author><name>dityalovers</name><uri>http://www.blogger.com/profile/15543044829406906904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq34876Mhy7aQGUI5GneVEAobOSdt-DvUlAIItJrNI-9xPc21tPj1UkA3Ew0sM-45w0IrHBMpWSkkmac7YttC39VZXPYsNn-unFwa3emd6CJRKxYyrqABbUX2KcmNslibpWzkSljk1tfXI/s72-w180-h320-c/WhatsApp+Image+2020-11-02+at+17.39.15.jpeg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Jakarta, Indonesia</georss:featurename><georss:point>-6.2087634 106.845599</georss:point><georss:box>-84.360119262464252 -33.779400999999993 71.942592462464262 -112.52940100000001</georss:box></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-2286506881660057504</id><published>2020-11-02T10:50:00.001+07:00</published><updated>2020-11-02T16:44:38.154+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Kotlin"/><category scheme="http://www.blogger.com/atom/ns#" term="OAuth2"/><category scheme="http://www.blogger.com/atom/ns#" term="Pemrograman"/><category scheme="http://www.blogger.com/atom/ns#" term="Retrofit"/><title type='text'>Android Login Retrofit OAuth2</title><content type='html'>&lt;div style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigy-qliqZS5YGEcYY9RUUFs3wQP0kgaSEb0Ua4-F9zgxMF8vrUEdYzL8DCysjwyeFkeJWLquIkrIz4CP24LIeMny-NyeUtP1dBXMp86IlMsbLbGR91Yg71x6i6JRJ1sm7AU5XRT3E2Bt15/s1847/WhatsApp+Image+2020-11-01+at+22.30.54.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1847&quot; data-original-width=&quot;1080&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigy-qliqZS5YGEcYY9RUUFs3wQP0kgaSEb0Ua4-F9zgxMF8vrUEdYzL8DCysjwyeFkeJWLquIkrIz4CP24LIeMny-NyeUtP1dBXMp86IlMsbLbGR91Yg71x6i6JRJ1sm7AU5XRT3E2Bt15/s320/WhatsApp+Image+2020-11-01+at+22.30.54.jpeg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;Pada tutorial kali ini, saya akan membahas tutorial pemrograman android dengan menggunakan kotlin. Library yang akan digunakan adalah Retrofit untuk &lt;i&gt;http request&lt;/i&gt;&amp;nbsp;ke &lt;i&gt;API Server&lt;/i&gt; yang menggunakan otentifikasi OAuth atau JWT, OkHttpClient untuk &lt;i&gt;request interceptor&lt;/i&gt;&amp;nbsp;(&lt;i&gt;bearer token&lt;/i&gt; / &lt;i&gt;api key&lt;/i&gt; akan disisipkan saat request ke &lt;i&gt;protected resources&lt;/i&gt;) dan Kotlin Android Extensions untuk menggantikan fungsi&amp;nbsp;&lt;i&gt;findViewById&lt;/i&gt;.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;OkHttpClient Interceptor juga dapat digunakan untuk intersepsi &lt;i&gt;request&lt;/i&gt; ketika &lt;i&gt;bearer token expired&lt;/i&gt; otomatis melakukan &lt;i&gt;request&lt;/i&gt; token baru dengan metode &lt;i&gt;refresh token&lt;/i&gt; pada OAuth2. Berikut merupakan &lt;i&gt;resume &lt;/i&gt;langkah-langkah pembuatannya dengan menggunakan android studio.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;Konfigurasi &lt;i&gt;Library&lt;/i&gt;&amp;nbsp;pada Gradle (Module)&lt;/h3&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Buat project baru pada android studio dengan Empty Activiy, isi&amp;nbsp;nama aplikasi dan nama &lt;i&gt;package&lt;/i&gt;, tempat penyimpanan &lt;i&gt;project,&lt;/i&gt; minimum OS (SDK) dan pilih Kotlin sebagai bahasa pemrogramannya. Pada jendela project browser,&amp;nbsp; buka file &lt;b&gt;Gradle Scripts &amp;gt; build.gradle (Module: &amp;lt;nama_app&amp;gt;.app)&lt;/b&gt;. Tambahkan baris berikut lalu lakukan &lt;i&gt;sync &lt;/i&gt;gradle.&lt;/div&gt;
&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/321f4b7e4f869ae52390c42a2e1e503a.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Buatlah&amp;nbsp;&lt;i&gt;package&lt;/i&gt;&amp;nbsp;baru dengan susunan sebagai berikut:&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;&lt;li&gt;com.&lt;i&gt;&amp;lt;company_name&amp;gt;&lt;/i&gt;.&lt;i&gt;&amp;lt;app_name&amp;gt;&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;data&lt;/li&gt;&lt;ul&gt;&lt;li&gt;requests&lt;/li&gt;&lt;li&gt;responses&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ui&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;utils&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;Package Utils&lt;/i&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Buatlah Kotlin File/Class dengan tipe&amp;nbsp;&lt;b style=&quot;font-style: italic;&quot;&gt;object&amp;nbsp;&lt;/b&gt;dibawah&amp;nbsp;&lt;i&gt;package&lt;/i&gt;&amp;nbsp;&lt;b&gt;utils&amp;nbsp;&lt;/b&gt;dengan nama&amp;nbsp;&lt;b&gt;Constants&lt;/b&gt;. File ini digunakan untuk membuat konstanta / variabel yg bersifat tetap dan dapat memudahkan jika suatu saat terjadi perubahan variabel pada aplikasi dan variabel sudah digunakan di banyak komponen aplikasi. File Constants ini berisi pengaturan&amp;nbsp;&lt;i&gt;base url&amp;nbsp;&lt;/i&gt;&amp;nbsp;API maupun daftar&amp;nbsp;&lt;i&gt;endpoint&lt;/i&gt;&amp;nbsp;API.&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/585fd74ff9d94e640af603213f7a83c5.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Buatlah Kotlin File/Class dengan tipe&amp;nbsp;&lt;i&gt;&lt;b&gt;Class&lt;/b&gt;&lt;/i&gt;&amp;nbsp;dibawah&amp;nbsp;&lt;i&gt;package&lt;/i&gt;&amp;nbsp;&lt;b&gt;utils&lt;/b&gt;&amp;nbsp;dengan nama&amp;nbsp;&lt;b&gt;SessionManager&lt;/b&gt;. File ini berisi&amp;nbsp;&lt;b style=&quot;font-style: italic;&quot;&gt;SharedPreferences&lt;/b&gt;&amp;nbsp;android yang dapat digunakan untuk menyimpan / mengakses data seperti&amp;nbsp;&lt;i&gt;session&lt;/i&gt;&amp;nbsp;jika di pemrograman berbasis&amp;nbsp;&lt;i&gt;web&lt;/i&gt;. Class SessionManager digunakan untuk menyimpan&amp;nbsp;&lt;i&gt;Bearer Token&lt;/i&gt;&amp;nbsp;dari hasil response login yang sukses.&amp;nbsp;&lt;i&gt;Bearer token&lt;/i&gt;&amp;nbsp;ini berfungsi seperti apiKey untuk mengakses service atau endpoint yang diproteksi. SharedPreferences ini dapat diakses di&amp;nbsp;&lt;i&gt;activity&lt;/i&gt;&amp;nbsp;/&amp;nbsp;&lt;i&gt;fragment&lt;/i&gt;&amp;nbsp;android.&lt;/div&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/cac63d5145f5ab2451a9ef623c0e5a25.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;Konfigurasi Retrofit&lt;/h3&gt;&lt;div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Sebelum membuat class dan interface Retrofit, kita persiapkan dahulu &lt;i&gt;request dan response &lt;/i&gt;untuk API login.&amp;nbsp;&lt;i&gt;Request &lt;/i&gt;untuk login hanya terdiri dari 2 &lt;i&gt;field&lt;/i&gt;, username dan password. Buat file Kotlin File/Class dengan tipe &lt;i style=&quot;font-weight: bold;&quot;&gt;Class&lt;/i&gt;&amp;nbsp;dibawah &lt;i&gt;package &lt;/i&gt;&lt;b&gt;requests&lt;/b&gt;&amp;nbsp;dengan nama &lt;b&gt;LoginRequest&lt;/b&gt;. Tambahkan data pada class LoginRequest seperti berikut.&lt;/div&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/864d0afe09b5f6a6d863bdf9815cf8d1.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Berikut ini merupakan contoh response JSON jika sukses login.&lt;/div&gt;
&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/a513f15b135b3107aec106798ba99b1a.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Untuk dapat membuat &lt;b&gt;data class&lt;/b&gt; dari json dengan mudah, install &lt;i&gt;&lt;b&gt;plugin&lt;/b&gt; &lt;b&gt;JSON to kotlin&lt;/b&gt;&lt;/i&gt; pada android studio dan letakkan dibawah &lt;i&gt;package&lt;/i&gt; &lt;b&gt;responses&lt;/b&gt; dengan nama &lt;b&gt;LoginResponse&lt;/b&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3uV8G-UtE8U0H4xUz829MeOGJhD-t2WCkkaB9LDa2chaRHntCmGR6WCH-s9YiLXZh8hERqGhqpzfDIDwME5yrZMWc7PUNWbWDB93jV8lr36iiyyg8iXPeBCaAHv51Mi4lowzsAPBX_4ea/s706/Screen+Shot+2020-11-02+at+07.00.49.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;706&quot; data-original-width=&quot;662&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3uV8G-UtE8U0H4xUz829MeOGJhD-t2WCkkaB9LDa2chaRHntCmGR6WCH-s9YiLXZh8hERqGhqpzfDIDwME5yrZMWc7PUNWbWDB93jV8lr36iiyyg8iXPeBCaAHv51Mi4lowzsAPBX_4ea/w600-h640/Screen+Shot+2020-11-02+at+07.00.49.png&quot; width=&quot;600&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/c555bcd943068d812cb37d040a29ef7b.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Buatlah Kotlin File/Class dengan tipe &lt;i&gt;&lt;b&gt;Interface&lt;/b&gt;&lt;/i&gt; dibawah &lt;i&gt;package&lt;/i&gt;&amp;nbsp;&lt;b&gt;data &lt;/b&gt;dengan nama &lt;b&gt;ApiService&lt;/b&gt;. File ini berisi daftar endpoint, method dan parameter yang ada pada API.&lt;/div&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/0ae83d45f580b9e842ce693f4e113cb3.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Buatlah Kotlin File/Class dengan tipe &lt;i style=&quot;font-weight: bold;&quot;&gt;Class &lt;/i&gt;dibawah &lt;i&gt;package &lt;/i&gt;&lt;b&gt;data&lt;/b&gt;&amp;nbsp;dengan nama &lt;b&gt;RequestInterceptor&lt;/b&gt;. File ini digunakan untuk intersepsi pada saat &lt;i&gt;request &lt;/i&gt;ke API dan melakukan pengecekan &lt;i&gt;shared preferences&lt;/i&gt; dengan nama key &lt;i&gt;access_token&lt;/i&gt; (SessionManager), jika &lt;i&gt;access_token&lt;/i&gt; tidak kosong akan ditambahkan &lt;b&gt;Header&lt;/b&gt; pada &lt;i&gt;request&lt;/i&gt;&amp;nbsp;yang berisi &lt;b&gt;&lt;i&gt;Authorization: Bearer &amp;lt;access_token&amp;gt;&amp;nbsp;&lt;/i&gt;&lt;/b&gt;sehingga pada &lt;i&gt;ApiService&lt;/i&gt; tidak perlu lagi menambahkan&amp;nbsp; parameter header&amp;nbsp;&lt;i&gt;access_token&lt;/i&gt; / &lt;i&gt;apikey&lt;/i&gt; untuk &lt;i&gt;request&lt;/i&gt; ke &lt;i&gt;protected resources&lt;/i&gt;.&lt;/div&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/5634a1efb2ba8f985bb60994ef95a886.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Buatlah Kotlin File/Class dengan tipe&amp;nbsp;&lt;i&gt;&lt;b&gt;Class&lt;/b&gt;&lt;/i&gt;&amp;nbsp;dibawah&amp;nbsp;&lt;i&gt;package&lt;/i&gt;&amp;nbsp;&lt;b&gt;data&amp;nbsp;&lt;/b&gt;dengan nama&amp;nbsp;&lt;b&gt;ApiClient&lt;/b&gt;. File berisi &lt;i&gt;instance &lt;/i&gt;retrofit dan okHttpClient untuk melakukan &lt;i&gt;http request &lt;/i&gt;ke API.&lt;/div&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/b98550e4bd8b14e8f39fed06ec047704.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;i&gt;Activity&lt;/i&gt; dan &lt;i&gt;UI&lt;/i&gt; (View)&lt;/h3&gt;&lt;div&gt;Pindahkan / &lt;i&gt;refactor&lt;/i&gt;&amp;nbsp;&lt;i style=&quot;font-weight: bold;&quot;&gt;MainActivity&lt;/i&gt;&amp;nbsp;yang berada dibawah &lt;i&gt;package &lt;/i&gt;utama ke &lt;i&gt;package &lt;/i&gt;&lt;b&gt;UI&lt;/b&gt;, tambahkan juga &lt;i&gt;activity &lt;/i&gt;baru (new&amp;nbsp;&lt;i&gt;empty activity)&lt;/i&gt; dengan nama &lt;i style=&quot;font-weight: bold;&quot;&gt;LoginActivity&lt;/i&gt;. Alur / proses yang akan dibuat nantinya seperti ini.&lt;/div&gt;&lt;blockquote&gt;App Start -&amp;gt; Cek Akses Token (MainActivity) -&amp;gt; Go To Login (LoginActivity) jika tidak ditemukan Akses Token atau Menampilkan Akses token dan Tombol Logout (MainActivity) jika Akses Token ditemukan (SessionManager)&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;Berikut ini merupakan design UI &lt;i&gt;LoginActivity&lt;/i&gt; dan &lt;i&gt;MainActivity&lt;/i&gt;&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/d4beab6cbf9ac7b81531f19d27ce2d7a.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/14bb128c5da057218d4fae045dc2baba.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/f5c3526821fc52e9778bc40b8c9c0742.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;p&gt;Berikut ini merupakan &lt;i&gt;source code&lt;/i&gt;&amp;nbsp;&lt;i&gt;LoginActivity&lt;/i&gt; dan &lt;i&gt;MainActivity&lt;/i&gt;&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/213ba28388662f7e57950a300b19af34.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/2e0c8c6eaa98a650c3d0df8d89fb65b2.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;i&gt;
Android Manifest&lt;/i&gt; dan &lt;i&gt;Permissions&lt;/i&gt;&lt;/h3&gt;&lt;div&gt;&lt;i&gt;Finally&lt;/i&gt;&amp;nbsp;untuk dapat melakukan &lt;i&gt;http request &lt;/i&gt;API, maka diperlukan android&amp;nbsp;&lt;i&gt;permission Internet. &lt;/i&gt;Konfigurasi MainActivity sebagai &lt;i&gt;LAUNCHER&lt;/i&gt; (&lt;i&gt;Activity&lt;/i&gt; yang pertama diload ketika aplikasi &lt;i&gt;start&lt;/i&gt;) dengan menggunakan&amp;nbsp;&lt;i&gt;intent filter&lt;/i&gt;.&lt;/div&gt;&lt;script src=&quot;https://gist.github.com/adit-gudhel/7effe95dacbc38ef412f8cf0abae8d0c.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;iframe allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/RE1QK9cxYig&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;TL;DR&lt;/h3&gt;&lt;div&gt;&lt;i&gt;Source code &lt;/i&gt;dan &lt;i&gt;drawable assets&lt;/i&gt;&amp;nbsp;lengkap dapat diunduh dari repo &lt;a href=&quot;http://ivononic.com/185738/github-repo&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;github&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/2286506881660057504/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2020/11/android-login-retrofit-oauth2.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/2286506881660057504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/2286506881660057504'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2020/11/android-login-retrofit-oauth2.html' title='Android Login Retrofit OAuth2'/><author><name>dityalovers</name><uri>http://www.blogger.com/profile/15543044829406906904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigy-qliqZS5YGEcYY9RUUFs3wQP0kgaSEb0Ua4-F9zgxMF8vrUEdYzL8DCysjwyeFkeJWLquIkrIz4CP24LIeMny-NyeUtP1dBXMp86IlMsbLbGR91Yg71x6i6JRJ1sm7AU5XRT3E2Bt15/s72-c/WhatsApp+Image+2020-11-01+at+22.30.54.jpeg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Jakarta, Indonesia</georss:featurename><georss:point>-6.2087634 106.845599</georss:point><georss:box>-34.518997236178848 71.689349 22.101470436178847 142.001849</georss:box></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-1745817555025266896</id><published>2020-02-02T08:06:00.002+07:00</published><updated>2020-02-02T08:06:49.519+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Big Data"/><category scheme="http://www.blogger.com/atom/ns#" term="Hadoop"/><category scheme="http://www.blogger.com/atom/ns#" term="Hive"/><title type='text'>Install Apache Hive di Cluster Hadoop CentOS 7</title><content type='html'>&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRYLA238oJVMIivP9vwecaCHhFYf7sNJp6xyhJwupmqGjIc6z__rKFbwfDsyCGK3zATQaagpmHP1TNt5fJ8w8b9KClph2RHtFrG5b6eFdoYdr1ijQ_WTdxVSzyV4LGsLa4U92BpbbMSnMg/s1600/hive.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;143&quot; data-original-width=&quot;353&quot; height=&quot;160&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRYLA238oJVMIivP9vwecaCHhFYf7sNJp6xyhJwupmqGjIc6z__rKFbwfDsyCGK3zATQaagpmHP1TNt5fJ8w8b9KClph2RHtFrG5b6eFdoYdr1ijQ_WTdxVSzyV4LGsLa4U92BpbbMSnMg/s400/hive.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;Apache Hive&amp;nbsp;&lt;/b&gt;merupakan project &lt;i&gt;data warehouse&lt;/i&gt; dan &lt;i&gt;analytics&lt;/i&gt; yang dibangun di atas platform Apache Hadoop. Tools ini awalnya dikembangkan oleh developer Facebook yang menilai cara akses/query data yang disimpan di platform Hadoop terlalu susah karena masih harus menggunakan konsep &lt;i&gt;Map&lt;/i&gt; and &lt;i&gt;Reduce&lt;/i&gt; yang implementasinya menggunakan programming Java. Untuk itu sebagai solusinya mereka menciptakan sebuah interface yang memungkinkan untuk melakukan &lt;i&gt;retrieval&lt;/i&gt; dan manipulasi data menggunakan bahasa yang serupa dengan syntax SQL.
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Pada tutorial sebelumnya kita sudah melakukan &lt;a href=&quot;https://dityalovers.blogspot.com/2020/02/install-hadoop-multi-cluster-centos-7.html&quot; target=&quot;_blank&quot;&gt;install apache hadoop multi cluster&lt;/a&gt;&amp;nbsp;pada server CentOS 7, tutorial kali ini membahas cara menghubungkan apache hive dengan hadoop cluster yang sudah kita buat.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Download Hive Source&lt;/h3&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ wget https://www-us.apache.org/dist/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
$ tar -zxvf apache-hive-3.1.2-bin.tar.gz
$ sudo mv apache-hive-3.1.2-bin /usr/local/hive
&lt;/pre&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Setup Environment Variable&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ su - hadoop
$ vi ~/.bashrc
# Sesuaikan dengan teks di bawah ini
# Java
export JAVA_HOME=$(dirname $(dirname $(readlink $(readlink $(which javac)))))

# Hadoop
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS=&quot;-Djava.library.path=$HADOOP_COMMON_LIB_NATIVE_DIR&quot;
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar

# Yarn
export YARN_HOME=$HADOOP_HOME

# Hive
HIVE_HOME=/usr/local/hive
HIVE_CONF_DIR=/usr/local/hive/conf

# Classpath
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$HADOOP_HOME/lib/*:$HIVE_HOME/lib/*

# Path
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Konfigurasi File &lt;b&gt;hive-env.sh&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ cd $HIVE_CONF_DIR
$ sudo cp hive-env.sh.template hive-env.sh
$ sudo chmod +x hive-env.sh
$ sudo vi hive-env.sh
# tambahkan pada akhir baris
HIVE_HOME=/usr/local/hive
HIVE_CONF_DIR=/usr/local/hive/conf
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Install MySQL dan JDBC MySQL Connector (Hive Metastore)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ sudo yum install mariadb-server
$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb
$ sudo mysql_secure_installation
$ wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.30.tar.gz
$ tar -zxvf mysql-connector-java-5.1.30.tar.gz
$ sudo cp mysql-connector-java-5.1.30/mysql-connector-java-5.1.30-bin.jar $HIVE_HOME/lib/
$ sudo chmod +x $HIVE_HOME/lib/mysql-connector-java-5.1.30-bin.jar
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Buat database MySQL dengan nama &lt;b&gt;metastore&lt;/b&gt; untuk Hive (initSchema)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ mysql -u root -p
&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: mysql; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;CREATE DATABASE metastore;
USE metastore;
SOURCE /usr/local/hive/scripts/metastore/upgrade/mysql/hive-schema-3.1.0.mysql.sql;
CREATE USER &#39;hive&#39;@localhost IDENTIFIED BY &#39;&lt;hive password=&quot;&quot;&gt;&#39;;
GRANT ALL ON *.* TO &#39;hive&#39;@localhost;
FLUSH PRIVILEGES;
&lt;/hive&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Konfigurasi File &lt;b&gt;hive-site.xml&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ cp $HIVE_CONF_DIR/hive-default.xml.template $HIVE_CONF_DIR/hive-site.xml
$ vi $HIVE_CONF_DIR/hive-site.xml
# hive-site.xml
&amp;lt;property&amp;gt;
    &amp;lt;name&amp;gt;hive.exec.local.scratchdir&amp;lt;/name&amp;gt;
    &amp;lt;value&amp;gt;/tmp/hive_temp&amp;lt;/value&amp;gt;
    &amp;lt;description&amp;gt;Local scratch space for Hive jobs&amp;lt;/description&amp;gt;
  &amp;lt;/property&amp;gt;
  &amp;lt;property&amp;gt;
    &amp;lt;name&amp;gt;hive.execution.engine&amp;lt;/name&amp;gt;
    &amp;lt;value&amp;gt;mr&amp;lt;/value&amp;gt;
    &amp;lt;description&amp;gt;
      Expects one of [mr, tez, spark].
      Chooses execution engine. Options are: mr (Map reduce, default)&amp;lt;/description&amp;gt;
  &amp;lt;/property&amp;gt;
  &amp;lt;property&amp;gt;
    &amp;lt;name&amp;gt;javax.jdo.option.ConnectionURL&amp;lt;/name&amp;gt;
    &amp;lt;value&amp;gt;jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true&amp;amp;useSSL=false&amp;lt;/value&amp;gt;
    &amp;lt;description&amp;gt;metadata is stored in a MySQL server&amp;lt;/description&amp;gt;
  &amp;lt;/property&amp;gt;
  &amp;lt;property&amp;gt;
    &amp;lt;name&amp;gt;javax.jdo.option.ConnectionDriverName&amp;lt;/name&amp;gt;
    &amp;lt;value&amp;gt;com.mysql.jdbc.Driver&amp;lt;/value&amp;gt;
    &amp;lt;description&amp;gt;Driver class name for a JDBC metastore&amp;lt;/description&amp;gt;
  &amp;lt;/property&amp;gt;
  &amp;lt;property&amp;gt;
    &amp;lt;name&amp;gt;javax.jdo.option.ConnectionUserName&amp;lt;/name&amp;gt;
    &amp;lt;value&amp;gt;hive&amp;lt;/value&amp;gt;
    &amp;lt;description&amp;gt;Username to use against metastore database&amp;lt;/description&amp;gt;
  &amp;lt;/property&amp;gt;
  &amp;lt;property&amp;gt;
    &amp;lt;name&amp;gt;javax.jdo.option.ConnectionPassword&amp;lt;/name&amp;gt;
    &amp;lt;value&amp;gt;***&amp;lt;/value&amp;gt;
    &amp;lt;description&amp;gt;password to use against metastore database&amp;lt;/description&amp;gt;
  &amp;lt;/property&amp;gt;
  &amp;lt;property&amp;gt;
    &amp;lt;name&amp;gt;hive.exec.scratchdir&amp;lt;/name&amp;gt;
    &amp;lt;value&amp;gt;/tmp/hive_tmp&amp;lt;/value&amp;gt;
    &amp;lt;description&amp;gt;HDFS root scratch dir for Hive jobs which gets created with write all (733) permission&amp;lt;/description&amp;gt;
  &amp;lt;/property&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Install HBase&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ cd ~/
$ wget http://apache.mirror.gtcomm.net/hbase/stable/hbase-2.2.3-bin.tar.gz
$ tar -zxvf hbase-2.2.3-bin.tar.gz
$ sudo mv hbase-2.2.3-bin /usr/local/hbase
$ sudo chown -R hadoop:hadoop /usr/local/hbase
$ sudo chmod -R g+rwx /usr/local/hbase
$ vi ~/.bashrc
# tambahkan
export HBASE_HOME=/usr/local/hbase
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$HBASE_HOME/bin
$ source ~/.bashrc
$ cd $HBASE_HOME/conf
$ vi hbase-env.sh
# atur JAVA_HOME
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/
$ vi hbase-site.xml
# tambahkan
&amp;lt;configuration&amp;gt;
   &amp;lt;property&amp;gt;
      &amp;lt;name&amp;gt;hbase.rootdir&amp;lt;/name&amp;gt;
      &amp;lt;value&amp;gt;hdfs://localhost:8030/hbase&amp;lt;/value&amp;gt;
   &amp;lt;/property&amp;gt;
	
   &amp;lt;property&amp;gt;
      &amp;lt;name&amp;gt;hbase.zookeeper.property.dataDir&amp;lt;/name&amp;gt;
      &amp;lt;value&amp;gt;/hadoop/zookeeper&amp;lt;/value&amp;gt;
   &amp;lt;/property&amp;gt;
   
   &amp;lt;property&amp;gt;
     &amp;lt;name&amp;gt;hbase.cluster.distributed&amp;lt;/name&amp;gt;
     &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;
   &amp;lt;/property&amp;gt;
&amp;lt;/configuration&amp;gt;
$ sudo mkdir -p /hadoop/zookeeper
$ sudo chown -R hadoop:hadoop /hadoop/
$ start-hbase.sh 
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Buat direktori database hive di HDFS&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ hdfs dfs -mkdir /user/
$ hdfs dfs -mkdir /user/hive
$ hdfs dfs -mkdir /user/hive/warehouse
$ hdfs dfs -mkdir /tmp
$ hdfs dfs -chmod -R a+rwx /user/hive/warehouse
$ hdfs dfs -chmod g+w /tmp
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Test Hive Console&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ hive
hive&amp;gt; show tables;
&lt;/pre&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioUgH0nMETdnsdzBvlFkaxeCNaWMciowp5yYtcAXqXp71gvdDo25gy0BmfW3c4zjopTYejfc1X-RzyNjInq4HDlw7UONsckWMr0otTcqOc8dAhZgr4N13uYyRwz6ayi9gPHnqOnD_GQjQY/s1600/Screen+Shot+2020-02-02+at+08.03.38.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;HiveQL on Hive Console&quot; border=&quot;0&quot; data-original-height=&quot;239&quot; data-original-width=&quot;366&quot; height=&quot;416&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioUgH0nMETdnsdzBvlFkaxeCNaWMciowp5yYtcAXqXp71gvdDo25gy0BmfW3c4zjopTYejfc1X-RzyNjInq4HDlw7UONsckWMr0otTcqOc8dAhZgr4N13uYyRwz6ayi9gPHnqOnD_GQjQY/s640/Screen+Shot+2020-02-02+at+08.03.38.png&quot; title=&quot;HiveQL&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;HiveQL on Hive Console&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Running Metastore dan Hive as Daemon (Background)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ mkdir $HIVE_HOME/logs
$ hive --service metastore --hiveconf hive.log.dir=$HIVE_HOME/logs --hiveconf hive.log.file=metastore.log &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;
$ hive --service hiveserver2 --hiveconf hive.log.dir=$HIVE_HOME/logs --hiveconf hive.log.file=hs2.log &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Testing Hive Web UI&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ hiveserver2
Akses ke browser http://hadoop02:10002
&lt;/pre&gt;
&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnU9m8kNb5v6MIF9ldQI3BdJJUxfWuCY-QRaKxIpHySGlVXeOYibuYJkUqPiHcXKWqPvFghwGUY6I9twOtrbQrAfMd6eBEuejRtMrHBynMm6jJcjCFiSSp_zPi3P9Ppytt0SQwIpcPAUMd/s1600/Screen+Shot+2020-02-02+at+07.59.44.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Hiveserver2 web ui&quot; border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;1280&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnU9m8kNb5v6MIF9ldQI3BdJJUxfWuCY-QRaKxIpHySGlVXeOYibuYJkUqPiHcXKWqPvFghwGUY6I9twOtrbQrAfMd6eBEuejRtMrHBynMm6jJcjCFiSSp_zPi3P9Ppytt0SQwIpcPAUMd/s640/Screen+Shot+2020-02-02+at+07.59.44.png&quot; title=&quot;Hiveserver2&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;HiveServer2 Web UI&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/1745817555025266896/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2020/02/install-apache-hive-di-cluster-hadoop.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1745817555025266896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1745817555025266896'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2020/02/install-apache-hive-di-cluster-hadoop.html' title='Install Apache Hive di Cluster Hadoop CentOS 7'/><author><name>Aditya Nursyahbani</name><uri>http://www.blogger.com/profile/07325213218049741746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTpoUrcVoSJHVanvhqCggtaov04yK6-3r_c3wRwWTa-ADRHKl5ZdFyYM_VXKVHST3BoEN5oUFsAjIXk9x_YbKEcc4eBdbd4JuWjCvPsWiZqs7NDDi9oXLU-mdIWFfTw/s220/SAM_1082.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRYLA238oJVMIivP9vwecaCHhFYf7sNJp6xyhJwupmqGjIc6z__rKFbwfDsyCGK3zATQaagpmHP1TNt5fJ8w8b9KClph2RHtFrG5b6eFdoYdr1ijQ_WTdxVSzyV4LGsLa4U92BpbbMSnMg/s72-c/hive.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-1520872123567816629</id><published>2020-02-01T10:19:00.001+07:00</published><updated>2020-02-01T10:19:39.913+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Big Data"/><category scheme="http://www.blogger.com/atom/ns#" term="Hadoop"/><title type='text'>Install Hadoop Multi Cluster CentOS 7</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgxpdc1Xvikj5DJ0p-8PK4zR1DP3pXIDhnmnOay7vBsiRH1_s3y_FhSxtXv4H0sJbHrUB6gVZ6GpPsz6XTXnMNOSyz09OooyvcMQuCekQK8YTnezqQLZmK-XFutgk8Fh3NmlSAtnkuEQaO/s1600/hadoop-logo.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;500&quot; data-original-width=&quot;920&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgxpdc1Xvikj5DJ0p-8PK4zR1DP3pXIDhnmnOay7vBsiRH1_s3y_FhSxtXv4H0sJbHrUB6gVZ6GpPsz6XTXnMNOSyz09OooyvcMQuCekQK8YTnezqQLZmK-XFutgk8Fh3NmlSAtnkuEQaO/s320/hadoop-logo.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;Apache Hadoop&lt;/b&gt; adalah kumpulan utilitas perangkat lunak open-source yang memfasilitasi penggunaan jaringan multi komputer untuk memecahkan masalah yang melibatkan data dan komputasi dalam jumlah besar. Hadoop merupakan framework perangkat lunak untuk penyimpanan terdistribusi dan pemrosesan data besar menggunakan model pemrograman MapReduce. Awalnya dirancang untuk klaster komputer yang dibangun dari perangkat keras komoditas dan juga digunakan pada kluster perangkat keras kelas atas. Semua modul di Hadoop dirancang dengan asumsi mendasar bahwa kegagalan perangkat keras adalah kejadian umum dan harus ditangani secara otomatis oleh framework.
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt; Persiapan&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;4 Server running OS Centos 7 (1 NameNode, 3 Data Node)&lt;/li&gt;
&lt;li&gt;Java 8&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://homoluath.com/185738/hadoop3-2-1&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Hadoop Version 3.2.1&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
&lt;b&gt; Arsitektur &lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;hadoop02 &lt;/b&gt;- 192.168.7.35 - NameNode&lt;/li&gt;
&lt;li&gt;&lt;b&gt;hadoop03&lt;/b&gt; - 192.168.7.36 - DataNode&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;hadoop04&lt;/b&gt; - 192.168.7.37 - DataNode&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;hadoop05&lt;/b&gt; - 192.168.7.38 - DataNode&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
&lt;b&gt;Setup Server (&lt;i&gt;All Server&lt;/i&gt;)&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Konfigurasi Hostname dan Host masing-masing server&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ sudo hostnamectl set-hostname hadoop02 # sesuaikan dengan arsitektur
$ sudo vi /etc/hosts
# tambahkan pada akhir baris
192.168.7.35 hadoop02
192.168.7.36 hadoop03
192.168.7.37 hadoop04
192.168.7.38 hadoop05
&lt;/pre&gt;
&lt;/div&gt;
&lt;li&gt;Disable firewall dan SELinux&amp;nbsp;&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
$ sudo vi /etc/selinux/config
# ubah SELINUX menjadi
SELINUX=disabled
$ sudo reboot now
&lt;/pre&gt;
&lt;/div&gt;
&lt;li&gt;Buat user hadoop&amp;nbsp;&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ sudo useradd hadoop
$ sudo usermod -aG wheel hadoop
$ sudo passwd hadoop # set password hadoop
&lt;/pre&gt;
&lt;/div&gt;
&lt;li&gt;Konfigurasi &lt;i&gt;Paswordless SSH&lt;/i&gt;&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ sudo su - hadoop
$ ssh-keygen -t rsa # kosongkan passphrase / enter sampai selesai
$ ssh-copy-id hadoop@hadoop02
$ ssh-copy-id hadoop@hadoop03
$ ssh-copy-id hadoop@hadoop04
$ ssh-copy-id hadoop@hadoop05
&lt;/pre&gt;
&lt;/div&gt;
&lt;li&gt;Install Java 8&amp;nbsp;&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ sudo yum update
$ sudo yum install -y epel-release java-1.8.0-openjdk
&lt;/pre&gt;
&lt;/div&gt;
&lt;li&gt;Konfigurasi environment variables &lt;b&gt;&lt;i&gt;~/.bashrc&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ vi ~/.bashrc
# tambahkan pada akhir baris
export JAVA_HOME=$(dirname $(dirname $(readlink $(readlink $(which javac)))))
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS=&quot;-Djava.library.path=$HADOOP_COMMON_LIB_NATIVE_DIR&quot;
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar
export YARN_HOME=$HADOOP_HOME
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$JAVA_HOME/bin
$ source ~/.bashrc&lt;/pre&gt;
&lt;/div&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Setup NameNode (Master) - 192.168.7.35&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Download hadoop-3.2.1&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ cd ~/
$ wget https://www-us.apache.org/dist/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz
$ tar -zxvf hadoop-3.2.1.tar.gz
$ sudo mv hadoop-3.2.1 /usr/local/hadoop
$ sudo chown -R hadoop:hadoop /usr/local/hadoop
$ sudo chmod -R g+rwx /usr/local/hadoop
&lt;/pre&gt;
&lt;/div&gt;
&lt;li&gt;Konfigurasi Hadoop Core Site &lt;i&gt;core-site.xml&lt;/i&gt;&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ cd $HADOOP_HOME/etc/hadoop
$ vi core-site.xml # core-site.xml
# tambahkan di dalam tag &amp;lt;configuration&amp;gt;
...
&amp;lt;configuration&amp;gt;
   &amp;lt;property&amp;gt;
      &amp;lt;name&amp;gt;fs.default.name&amp;lt;/name&amp;gt;
      &amp;lt;value&amp;gt;hdfs://hadoop02:9000&amp;lt;/value&amp;gt;
   &amp;lt;/property&amp;gt;
 
   &amp;lt;property&amp;gt;
      &amp;lt;name&amp;gt;dfs.permissions&amp;lt;/name&amp;gt;
       &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;
   &amp;lt;/property&amp;gt;
&amp;lt;/configuration&amp;gt;
...
&lt;/pre&gt;
&lt;/div&gt;
&lt;li&gt;Konfigurasi HDFS &lt;i&gt;hdfs-site.xml&lt;/i&gt;&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ cd $HADOOP_HOME/etc/hadoop
$ vi hdfs-site.xml # hdfs-site.xml
# tambahkan di dalam tag &amp;lt;configuration&amp;gt;...
&amp;lt;configuration&amp;gt;
   &amp;lt;!-- Setting path direktori namenode --&amp;gt;
   &amp;lt;property&amp;gt;
      &amp;lt;name&amp;gt;dfs.name.dir&amp;lt;/name&amp;gt;
      &amp;lt;value&amp;gt;/usr/local/hadoop/data/nameNode&amp;lt;/value&amp;gt;
   &amp;lt;/property&amp;gt;

   &amp;lt;!-- Setting path direktori datanode --&amp;gt;
   &amp;lt;property&amp;gt;
      &amp;lt;name&amp;gt;dfs.data.dir&amp;lt;/name&amp;gt;
      &amp;lt;value&amp;gt;/usr/local/hadoop/data/nameNode&amp;lt;/value&amp;gt;
   &amp;lt;/property&amp;gt;
 
   &amp;lt;!-- Jumlah replikasi --&amp;gt;
   &amp;lt;property&amp;gt;
      &amp;lt;name&amp;gt;dfs.replication&amp;lt;/name&amp;gt;
      &amp;lt;value&amp;gt;3&amp;lt;/value&amp;gt;
   &amp;lt;/property&amp;gt;
&amp;lt;/configuration&amp;gt;
...
&lt;/pre&gt;
&lt;/div&gt;
&lt;li&gt;Konfigurasi Worker (slave / data node) &lt;i&gt;workers&lt;/i&gt;&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ cd $HADOOP_HOME/etc/hadoop
$ vi workers
#isi dengan list hostname slave / data node
hadoop03
hadoop04
hadoop05
&lt;/pre&gt;
&lt;/div&gt;
&lt;li&gt;Copy hadoop direktori ke semua &lt;b&gt;server data node&lt;/b&gt;&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ sudo scp -R /usr/local/hadoop hadoop03:/usr/local/hadoop
$ sudo scp -R /usr/local/hadoop hadoop04:/usr/local/hadoop
$ sudo scp -R /usr/local/hadoop hadoop05:/usr/local/hadoop
&lt;/pre&gt;
&lt;/div&gt;
&lt;li&gt;Format HDFS filesystem&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ hdfs namenode -format
&lt;/pre&gt;
&lt;/div&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Setup DataNode (Slave) - 192.168.7.[36-38]&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Atur owner / permission direktori hadoop&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ sudo chown -R hadoop:hadoop /usr/local/hadoop
$ sudo chmod -R g+rwx /usr/local/hadoop
&lt;/pre&gt;
&lt;/div&gt;
&lt;li&gt;Konfigurasi Hadoop Yarn Site &lt;i&gt;yarn-site.xml&lt;/i&gt;&lt;/li&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;...
&amp;lt;configuration&amp;gt;
   &amp;lt;!-- Site specific YARN configuration properties --&amp;gt;
   &amp;lt;property&amp;gt;
      &amp;lt;name&amp;gt;yarn.resourcemanager.hostname&amp;lt;/name&amp;gt;
      &amp;lt;value&amp;gt;hadoop02&amp;lt;/value&amp;gt;
   &amp;lt;/property&amp;gt;
&amp;lt;/configuration&amp;gt;
...
&lt;/pre&gt;
&lt;/div&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Start DFS (on NameNode server)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ start-dfs.sh
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Start Yarn (on NameNode server)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ start-yarn.sh
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Check JVM Process&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ jps
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Check / List Yarn Node&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;$ yarn node -list
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Running Hadoop Web Monitoring&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;http://hadoop02:9870&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ2as5xnAV_uKCCZW5mPqUAKZDSDE2lLbbKFifIRjSvTYCdQARej9u13x8UhcX7lWtRBGb-a3Y80GM8sgSo7P5D8tpAn0IMwAGoK0XOCWodEPdzcNMpnslum5s3vvqq0j8wD-TmszfR2tZ/s1600/Screen+Shot+2020-02-01+at+08.57.42.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;hadoop web monitoring&quot; border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;1280&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ2as5xnAV_uKCCZW5mPqUAKZDSDE2lLbbKFifIRjSvTYCdQARej9u13x8UhcX7lWtRBGb-a3Y80GM8sgSo7P5D8tpAn0IMwAGoK0XOCWodEPdzcNMpnslum5s3vvqq0j8wD-TmszfR2tZ/s640/Screen+Shot+2020-02-01+at+08.57.42.png&quot; title=&quot;hadoop web monitoring&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Hadoop Web Health Check&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRLFKWYC4baMj1i_ywyNX4AbH89ZKfl3L5rbRB-zIIgoGEVjZGV6HI4IWu6DPCV-eoW5UQB5sWBDrAdYAWQunoJjRKZF4Hm2pFGXNMCc4PjjypLO0yHjC2q1hsT870a-yG9NVQ9KuSWILk/s1600/Screen+Shot+2020-02-01+at+08.58.09.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;hadoop data node&quot; border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;1280&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRLFKWYC4baMj1i_ywyNX4AbH89ZKfl3L5rbRB-zIIgoGEVjZGV6HI4IWu6DPCV-eoW5UQB5sWBDrAdYAWQunoJjRKZF4Hm2pFGXNMCc4PjjypLO0yHjC2q1hsT870a-yG9NVQ9KuSWILk/s640/Screen+Shot+2020-02-01+at+08.58.09.png&quot; title=&quot;hadoop data node&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Hadoop Data Node Usage&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/1520872123567816629/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2020/02/install-hadoop-multi-cluster-centos-7.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1520872123567816629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1520872123567816629'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2020/02/install-hadoop-multi-cluster-centos-7.html' title='Install Hadoop Multi Cluster CentOS 7'/><author><name>Aditya Nursyahbani</name><uri>http://www.blogger.com/profile/07325213218049741746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTpoUrcVoSJHVanvhqCggtaov04yK6-3r_c3wRwWTa-ADRHKl5ZdFyYM_VXKVHST3BoEN5oUFsAjIXk9x_YbKEcc4eBdbd4JuWjCvPsWiZqs7NDDi9oXLU-mdIWFfTw/s220/SAM_1082.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgxpdc1Xvikj5DJ0p-8PK4zR1DP3pXIDhnmnOay7vBsiRH1_s3y_FhSxtXv4H0sJbHrUB6gVZ6GpPsz6XTXnMNOSyz09OooyvcMQuCekQK8YTnezqQLZmK-XFutgk8Fh3NmlSAtnkuEQaO/s72-c/hadoop-logo.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-1762030414393336428</id><published>2017-05-11T22:13:00.001+07:00</published><updated>2019-02-04T22:24:31.253+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><category scheme="http://www.blogger.com/atom/ns#" term="Pemrograman"/><title type='text'>Default Authentification Laravel 5.4</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGxx7yVnxjJJ5-smre6ANNZ11DyYfULKgNTMKHjBtvJcVUq4HAy_nAhg-Mg8B_OQ95BbBULaOvBfKE8cxwJOl9mp5W9VeVmftj5BVSUg3qR4QR7xw8SricGIQtfUG1WSltywE5AKlQYTMs/s1600/Laravel_logo.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;145&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGxx7yVnxjJJ5-smre6ANNZ11DyYfULKgNTMKHjBtvJcVUq4HAy_nAhg-Mg8B_OQ95BbBULaOvBfKE8cxwJOl9mp5W9VeVmftj5BVSUg3qR4QR7xw8SricGIQtfUG1WSltywE5AKlQYTMs/s200/Laravel_logo.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Umumnya pada setiap pekerjaan atau proyek aplikasi &lt;i&gt;web&lt;/i&gt; akan membutuhkan authentifikasi pengguna / sistem login sebelum dapat mengakses fitur aplikasi selain untuk alasan keamanan juga. Tutorial kali ini saya akan membahas bagaimana cara mengaktifkan modul authentifikasi &lt;i&gt;default&lt;/i&gt; laravel, cukup dengan beberapa perintah, laravel sudah menyediakan mulai dari login akun pengguna, pendaftaran akun pengguna, sampai dengan fitur untuk mereset password jika lupa dan mengirim email untuk mendapatkan token untuk reset password. Kita akan melanjutkan &lt;i&gt;project&lt;/i&gt; social yang sebelumnya sudah kita buat, untuk cara instalasi dan membuat &lt;i&gt;project&lt;/i&gt; laravel bisa lihat di postingan saya sebelumnya &lt;a href=&quot;http://www.aditya-nursyahbani.net/2017/05/hello-laravel.html&quot; target=&quot;_blank&quot;&gt;hello laravel&lt;/a&gt;.&lt;br /&gt;
&lt;h3&gt;
Konfigurasi &lt;i&gt;Database&lt;/i&gt;&lt;/h3&gt;
&lt;div&gt;
Langkah pertama adalah membuat &lt;i&gt;database&lt;/i&gt; baru, laravel mendukung beberapa &lt;i&gt;database&lt;/i&gt; diantaranya SQLite, MySQL, PostgreSQL dan SQL Server. Untuk tutorial ini saya menggunakan &lt;i&gt;database&lt;/i&gt; MySQL. Buat &lt;i&gt;database&lt;/i&gt; baru di PhpMyAdmin atau &lt;i&gt;console&lt;/i&gt;, nama &lt;i&gt;database&lt;/i&gt; terserah, saya membuatnya dengan nama &lt;i&gt;social_db&lt;/i&gt;.&amp;nbsp;&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUOmhn0ZDkBuxIONPx-eCLBHB_1OkRryJyYZP1S8ytzkDonphsx_aAV3GzgqZ5jwA-IlF7wfQ_8RPKRyl0pDNdUCOHY2Wvt0SyZ-nJ33QI92XpDCSXDS561lnO3WqJgemW3Lg8SrqJ3w4F/s1600/db.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;membuat database baru di mysql&quot; border=&quot;0&quot; height=&quot;161&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUOmhn0ZDkBuxIONPx-eCLBHB_1OkRryJyYZP1S8ytzkDonphsx_aAV3GzgqZ5jwA-IlF7wfQ_8RPKRyl0pDNdUCOHY2Wvt0SyZ-nJ33QI92XpDCSXDS561lnO3WqJgemW3Lg8SrqJ3w4F/s400/db.png&quot; title=&quot;membuat database baru di mysql&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Membuat Database Baru di MySQL&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
Setelah database dibuat, langkah selanjutnya adalah konfigurasi database di laravel. Buka &lt;i&gt;project &lt;/i&gt;social di IDE kesayangan anda. Buka file &lt;b&gt;&lt;i&gt;.&lt;span style=&quot;color: blue;&quot;&gt;env&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; di root project, sesuaikan konfigurasi database anda.&lt;/div&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;; filename: &#39;.env&#39;&quot; style=&quot;margin: 0px;&quot;&gt;DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=social_db
DB_USERNAME=adit
DB_PASSWORD=adit&lt;/pre&gt;
&lt;/div&gt;
Untuk dapat melihat konfigurasi &lt;i&gt;database&lt;/i&gt; secara lengkap ada di file &lt;b&gt;&lt;i style=&quot;background-color: white;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;config/database.php&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;h3&gt;
Migration&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Secara &lt;i&gt;default&lt;/i&gt;, laravel menyediakan 2 &lt;i&gt;file schema database&lt;/i&gt; dapat di lihat di direktori/folder &lt;b&gt;&lt;i&gt;database/migrations&lt;/i&gt;&lt;/b&gt;, &lt;i&gt;schema&lt;/i&gt; &lt;i&gt;database&lt;/i&gt; gampangnya adalah &lt;i&gt;blueprint&lt;/i&gt; dari pembuatan &lt;i&gt;table&lt;/i&gt; pada database. Migration pada laravel adalah proses mengubah / migrasi dari schema menjadi tabel-tabel database. Kita akan migrasikan 2 schema : &lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: blue;&quot;&gt;create_users_table&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; dan &lt;b style=&quot;font-style: italic;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;create_password_resets_table&lt;/span&gt;&lt;/b&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Buka terminal / command prompt dan ubah ke direktori atau folder root project social&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Jalankan perintah : &lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: blue;&quot;&gt;php artisan migrate&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyUEntrvA71rCCM4onHFogpFGdTHDqRtOtN_LS6XAI-qFy2ial8XvZMhIlOLIAd9eAVK6jBalHFteS_nlv-usBydGIZecGHvXTn6GnFbhSkD_zokSW3mwQh251RQi6wcV9MONZEogUbPdx/s1600/migrate.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;93&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyUEntrvA71rCCM4onHFogpFGdTHDqRtOtN_LS6XAI-qFy2ial8XvZMhIlOLIAd9eAVK6jBalHFteS_nlv-usBydGIZecGHvXTn6GnFbhSkD_zokSW3mwQh251RQi6wcV9MONZEogUbPdx/s400/migrate.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;font-size: 12.8px;&quot;&gt;Migrasi &lt;i&gt;Schema&lt;/i&gt; ke &lt;i&gt;Database&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Lihat hasil migrate, pastikan semua migrasi berjalan sukses, jika sukses periksa database social_db, tabel-tabel dari proses migrasi berhasil dibuat.&lt;/li&gt;
&lt;/ul&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUpYgIBGVf5BZKzbPhdV6svcwTJijbWlGM4aOeC3HHMX9smFbeyglqxbj4NlVlK3hf1i4rk9jLmPuNnSXr9vy8bHO5VAiEica1wetXxMK5i7K0Qt9LDzxoTTNhnfqTynEhydkl8xJ-VWYe/s1600/sequelpro.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;266&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUpYgIBGVf5BZKzbPhdV6svcwTJijbWlGM4aOeC3HHMX9smFbeyglqxbj4NlVlK3hf1i4rk9jLmPuNnSXr9vy8bHO5VAiEica1wetXxMK5i7K0Qt9LDzxoTTNhnfqTynEhydkl8xJ-VWYe/s400/sequelpro.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;font-size: 12.8px;&quot;&gt;Table berhasil di buat&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Jika muncul error &quot;&lt;b style=&quot;font-style: italic;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;Specified key was too long; max key length is 767 bytes&lt;/span&gt;&quot;&lt;/b&gt;, berarti versi MySQL anda di bawah 5.7, laravel versi 5.4 mengubah &lt;i&gt;default&lt;/i&gt; &lt;i&gt;collation&lt;/i&gt;nya menjadi utf8mb4, karena di versi ini &lt;i&gt;support&lt;/i&gt; untuk emoji &lt;i&gt;which&lt;/i&gt; &lt;i&gt;is&lt;/i&gt; membutuhkan karakter string lebih banyak. Cara mengatasinya, buka file &lt;b&gt;&lt;i style=&quot;background-color: white;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;AppServiceProvider.php&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; yang terletak pada direktori&amp;nbsp;&lt;i style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;app/Providers&lt;/span&gt;&lt;/i&gt;, kemudian modifikasi seperti berikut :
&lt;br /&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; filename: &#39;AppServiceProvider.php&#39;&quot; style=&quot;margin: 0px;&quot;&gt;&amp;lt;?php
...
use Illuminate\Support\Facades\Schema;
...
public function boot(){
    Schema::defaultStringLength(191);
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3&gt;
&lt;i&gt;
Generate Auth Scaffolding&lt;/i&gt;&lt;/h3&gt;
&lt;div&gt;
Setelah tabel-tabel &lt;i&gt;database&lt;/i&gt; selesai dibuat, kita akan men&lt;i&gt;generate auth scaffolding&lt;/i&gt; bawaan laravel, laravel akan men&lt;i&gt;generate&lt;/i&gt; &lt;i&gt;Controller&lt;/i&gt;, &lt;i&gt;Route&lt;/i&gt;, &lt;i&gt;Model&lt;/i&gt;, dan &lt;i&gt;View&lt;/i&gt; secara otomatis.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Buka &lt;i&gt;terminal&lt;/i&gt; / &lt;i&gt;command&lt;/i&gt; &lt;i&gt;prompt&lt;/i&gt; dan ubah ke direktori atau folder root project social&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Jalankan perintah :&amp;nbsp;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: blue;&quot;&gt;php artisan make:auth&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfcX65zSakzcpX2g_blgpElFAMy4z7GKbzwjHU7VKdAirjZiKzXziLwQiW63O_LTPvWqeXXWHCUeyESmooxLtx_cg_BpDM6MVFEX9cHQK49TUo1mNR5hV3Nd-NlMEpC6JYUCSWHUlCrvjY/s1600/make_auth.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;118&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfcX65zSakzcpX2g_blgpElFAMy4z7GKbzwjHU7VKdAirjZiKzXziLwQiW63O_LTPvWqeXXWHCUeyESmooxLtx_cg_BpDM6MVFEX9cHQK49TUo1mNR5hV3Nd-NlMEpC6JYUCSWHUlCrvjY/s400/make_auth.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;font-size: 12.8px;&quot;&gt;&lt;i&gt;Generate Auth Scaffolding&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Jika berhasil, aplikasi bisa langsung di &lt;i&gt;test&lt;/i&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3&gt;
Testing&lt;/h3&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Buka &lt;i&gt;terminal&lt;/i&gt; / &lt;i&gt;command&lt;/i&gt; &lt;i&gt;prompt&lt;/i&gt; dan ubah ke direktori atau folder root project social&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Jalankan perintah :&amp;nbsp;&lt;b style=&quot;font-style: italic;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;php artisan serve&lt;/span&gt;&lt;/b&gt;&amp;nbsp;untuk menjalankan &lt;i&gt;server&lt;/i&gt; lokal pada port 8000&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Buka &lt;i&gt;browser&lt;/i&gt; ketikkan alamat http://localhost:8000 atau http://127.0.0.1:8000.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3&gt;
Screenshots&lt;/h3&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ-gxW3Jx3AsPK4LYjeOQI2g4yooJsxiBPAEG3vtJsPaTEH_3RpCVHMJoOXx8Q-rDdlDwLmjRcVt-PV_Bs_423vMajp8ThAtpd74yXzzUc1bBAmhoe6VFSFR4Q17mHrAvMw9yv-vBBXZMA/s1600/landing.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;370&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ-gxW3Jx3AsPK4LYjeOQI2g4yooJsxiBPAEG3vtJsPaTEH_3RpCVHMJoOXx8Q-rDdlDwLmjRcVt-PV_Bs_423vMajp8ThAtpd74yXzzUc1bBAmhoe6VFSFR4Q17mHrAvMw9yv-vBBXZMA/s400/landing.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Landing Page&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfzqP7uyQd3gbgB73CBxBQ7W3ABEPZHLgx25tujCb8u4I-XHrCPr5eOBtnVY-2d__pgMX2vME2EV0DPqk7dAwdF5_sQyI8SyBHPljTmo6ns8XIK9_1T76bqHvn4HXB9-UElYHEQap2FwXr/s1600/login.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;243&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfzqP7uyQd3gbgB73CBxBQ7W3ABEPZHLgx25tujCb8u4I-XHrCPr5eOBtnVY-2d__pgMX2vME2EV0DPqk7dAwdF5_sQyI8SyBHPljTmo6ns8XIK9_1T76bqHvn4HXB9-UElYHEQap2FwXr/s400/login.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Login&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH2gfteKVF9YYPb6Zoscr1CxpvJy31oHxyV6xMinU7cH9zJNeM54s-beeaVJ3wOcaLSXmbIM78A9boduamTa6fRNWjMnU3iDeToaCX9h7MeYumHKckQBHkzg5hK_uFs0r585xpe6xVbhIJ/s1600/homepage.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;107&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH2gfteKVF9YYPb6Zoscr1CxpvJy31oHxyV6xMinU7cH9zJNeM54s-beeaVJ3wOcaLSXmbIM78A9boduamTa6fRNWjMnU3iDeToaCX9h7MeYumHKckQBHkzg5hK_uFs0r585xpe6xVbhIJ/s400/homepage.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Homepage setelah login&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9eyHNdTuyhPZT7_jkEpNNxTSyux9HZ9xvyq2Dg4m_NZXFgmYdbKN6Rmu9wVIu0E3vdWOslGUT_7hpvC3UwcWtYcNG89WQ_vO5k63R5jBBjfGMi0DpvJCtDIpbk6dvdm_S5d7RG1p8BW4V/s1600/register.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;312&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9eyHNdTuyhPZT7_jkEpNNxTSyux9HZ9xvyq2Dg4m_NZXFgmYdbKN6Rmu9wVIu0E3vdWOslGUT_7hpvC3UwcWtYcNG89WQ_vO5k63R5jBBjfGMi0DpvJCtDIpbk6dvdm_S5d7RG1p8BW4V/s400/register.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Register&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;b&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;h3&gt;
Download &lt;i&gt;source code&lt;/i&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;Source code &lt;/i&gt;artikel ini dapat di download di &lt;a href=&quot;http://adf.ly/185738/auth-laravel&quot; rel=&quot;nofollow&quot;&gt;github&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/1762030414393336428/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2017/05/default-authentification-laravel-54.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1762030414393336428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1762030414393336428'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2017/05/default-authentification-laravel-54.html' title='Default Authentification Laravel 5.4'/><author><name>Aditya Nursyahbani</name><uri>http://www.blogger.com/profile/07325213218049741746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTpoUrcVoSJHVanvhqCggtaov04yK6-3r_c3wRwWTa-ADRHKl5ZdFyYM_VXKVHST3BoEN5oUFsAjIXk9x_YbKEcc4eBdbd4JuWjCvPsWiZqs7NDDi9oXLU-mdIWFfTw/s220/SAM_1082.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGxx7yVnxjJJ5-smre6ANNZ11DyYfULKgNTMKHjBtvJcVUq4HAy_nAhg-Mg8B_OQ95BbBULaOvBfKE8cxwJOl9mp5W9VeVmftj5BVSUg3qR4QR7xw8SricGIQtfUG1WSltywE5AKlQYTMs/s72-c/Laravel_logo.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-1991369388531688175</id><published>2017-05-09T19:05:00.000+07:00</published><updated>2019-02-04T22:24:39.378+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><category scheme="http://www.blogger.com/atom/ns#" term="Pemrograman"/><title type='text'>Hello Laravel!</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRZWxbv5PSSwAGPa0r3lDZ1zsiGv2a0MHg1_Er7MmoDfv5sYMprOUWcn-tEF_b8dbVb_XJEVW-UFocmWZg4uq-AQKN_pV7yK3sHCCw8JldBtmx_1TIsbu8eVNlpPK6EXIiQwjsyzORjeN1/s1600/Laravel_logo.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;&lt;img alt=&quot;laravel logo&quot; border=&quot;0&quot; height=&quot;145&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRZWxbv5PSSwAGPa0r3lDZ1zsiGv2a0MHg1_Er7MmoDfv5sYMprOUWcn-tEF_b8dbVb_XJEVW-UFocmWZg4uq-AQKN_pV7yK3sHCCw8JldBtmx_1TIsbu8eVNlpPK6EXIiQwjsyzORjeN1/s200/Laravel_logo.png&quot; title=&quot;laravel logo&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Halo sobat blogger, semoga kalian semua masih diberikan kesehatan oleh Allah SWT, amiin. Pada kesempatan kali ini saya akan membahas PHP &lt;i&gt;framework&lt;/i&gt; yang cukup terkenal, &lt;b&gt;Laravel&lt;/b&gt;. Ya, Laravel yang katanya &lt;i&gt;Framework For Web Artisan &lt;/i&gt;(Framework untuk para seniman &lt;i&gt;web&lt;/i&gt;). Laravel ini dibuat oleh Taylor Otwell yg basicnya dia itu &lt;i&gt;programmer&lt;/i&gt; .net. Yang menurut saya cukup menarik dari framework ini adalah sintaksnya yg &lt;i&gt;simple&lt;/i&gt;, &lt;i&gt;human readable&lt;/i&gt;, ekspresif banget. Selain itu Laravel juga menyediakan fitur-fitur yg sering digunakan dalam web project seperti &lt;i&gt;migration&lt;/i&gt; (seperti &lt;i&gt;version control&lt;/i&gt; pada &lt;i&gt;database&lt;/i&gt;), autentifikasi, &lt;i&gt;form validation&lt;/i&gt;, semuanya disediakan Laravel &lt;i&gt;out of the box&lt;/i&gt;. Jika ingin membuat Oauth2 server Laravel sudah menyediakan &lt;i&gt;package&lt;/i&gt; Passport, membuat &lt;i&gt;multiple social network login&lt;/i&gt; (Facebook, Twitter, G+, etc)? gampang banget, Laravel punya &lt;i&gt;package&lt;/i&gt; yang namanya Socialite.&lt;/div&gt;
&lt;h3&gt;
Kebutuhan &lt;i&gt;Server&lt;/i&gt; (&lt;i&gt;Requirements&lt;/i&gt;)&lt;/h3&gt;
&lt;div&gt;
Untuk dapat menjalankan Laravel, dapat menggunakan &lt;a href=&quot;https://laravel.com/docs/5.4/homestead&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Homestead&lt;/a&gt;, &lt;a href=&quot;https://laravel.com/docs/5.4/valet&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Valet&lt;/a&gt; (Khusus pengguna Mac) atau dapat menjalankan dengan spesifikasi berikut:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;PHP minimum versi 5.6.4 atau lebih tinggi&lt;/li&gt;
&lt;li&gt;Ekstensi PHP :&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;OpenSSL&lt;/li&gt;
&lt;li&gt;PDO&lt;/li&gt;
&lt;li&gt;Mbstring&lt;/li&gt;
&lt;li&gt;Tokenizer&lt;/li&gt;
&lt;li&gt;XML&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;a href=&quot;https://getcomposer.org/download/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Composer&lt;/a&gt; (Dependency manager for PHP)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Instalasi Laravel&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
Pastikan composer telah terinstall baik pada komputer anda, ada 2 cara untuk instalasi Laravel :&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Via Laravel Installer&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Buka &lt;i&gt;terminal / command promp&lt;/i&gt;t dan ubah ke direktori yang diinginkan untuk menyimpan project.&lt;/li&gt;
&lt;li&gt;Ketikkan perintah : &lt;br /&gt;&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;&quot; style=&quot;margin: 0px;&quot;&gt;composer global require &quot;laravel/installer&quot;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;ul&gt;&lt;ul&gt;
&lt;li&gt;Untuk membuat &lt;i&gt;project&lt;/i&gt; baru cukup ketikkan :&amp;nbsp;&lt;b&gt;laravel new &amp;lt;nama_project&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;&quot; style=&quot;margin: 0px;&quot;&gt;laravel new social&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
Tunggu sampai &lt;i&gt;download project&lt;/i&gt; selesai
&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Via Composer Create-Project&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Buka &lt;i&gt;terminal / command prompt&lt;/i&gt; dan ubah ke direktori yang diinginkan untuk menyimpan &lt;i&gt;project&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;Ketikkan perintah : &lt;b&gt;composer create-project --prefer-dist laravel/laravel &amp;lt;nama_project&amp;gt;&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;&quot; style=&quot;margin: 0px;&quot;&gt;composer create-project --prefer-dist laravel/laravel social&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Tunggu sampai &lt;i&gt;download&lt;/i&gt; project selesai&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Via Github&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;Download&lt;/i&gt; .zip source code &lt;a href=&quot;https://github.com/laravel/laravel/archive/master.zip&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;laravel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ekstrak folder master.zip.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Buka &lt;i&gt;terminal / command prompt&lt;/i&gt; dan ubah ke direktori folder hasil ekstrak.&lt;/li&gt;
&lt;li&gt;Ketikkan perintah :&lt;br /&gt;&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;&quot; style=&quot;margin: 0px;&quot;&gt;composer update&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Tunggu sampai proses &lt;i&gt;update&lt;/i&gt; selesai.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglf7U4awl5DQy1VRv5mE607ZJhT1hOOEH7-YUngModiMP1heHAKVKHV2wTZX9ZgtQ9tvkLURtutvyQ_VJxOQaIqVO6RH0SlRds8cDNTdX6Xq-m3TiBt8XOBRnFSuFGnZEGkslCgFu66tMq/s1600/install.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;instalasi laravel&quot; border=&quot;0&quot; height=&quot;408&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglf7U4awl5DQy1VRv5mE607ZJhT1hOOEH7-YUngModiMP1heHAKVKHV2wTZX9ZgtQ9tvkLURtutvyQ_VJxOQaIqVO6RH0SlRds8cDNTdX6Xq-m3TiBt8XOBRnFSuFGnZEGkslCgFu66tMq/s640/install.png&quot; title=&quot;instalasi laravel&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Instalasi Laravel Sukses&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3&gt;
Testing Local Server&amp;nbsp;&lt;/h3&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3qIOqfVbZ_cBgEeWgJp-Ckc6Xju8q-ES3Q3zY4VAj-Z89gVC2OijfG0h5Xgq5_M8d17RvQjaRDPA1EN5M3Os8HfND2FFxEjXpM9paVRRpYL-NeRJ_o-iIUgF1g6jePSRcMmDqfdr3M3wi/s1600/serve.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Buka &lt;i&gt;terminal / command prompt&lt;/i&gt;, masuk ke &lt;i&gt;root&lt;/i&gt; direktori &lt;i&gt;project&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Ketikkan perintah :&lt;br /&gt;&lt;pre class=&quot;brush: bash; toolbar:&#39;false&#39;&quot; style=&quot;margin: 0px;&quot;&gt;php artisan serve&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Setelah &lt;i&gt;running&lt;/i&gt;, akses ke &lt;i&gt;browser&lt;/i&gt; &lt;a href=&quot;http://localhost:8000/&quot;&gt;http://localhost:8000&lt;/a&gt; atau &lt;a href=&quot;http://127.0.0.1:8000/&quot;&gt;http://127.0.0.1:8000&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3qIOqfVbZ_cBgEeWgJp-Ckc6Xju8q-ES3Q3zY4VAj-Z89gVC2OijfG0h5Xgq5_M8d17RvQjaRDPA1EN5M3Os8HfND2FFxEjXpM9paVRRpYL-NeRJ_o-iIUgF1g6jePSRcMmDqfdr3M3wi/s1600/serve.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;img alt=&quot;laravel local server&quot; border=&quot;0&quot; height=&quot;448&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3qIOqfVbZ_cBgEeWgJp-Ckc6Xju8q-ES3Q3zY4VAj-Z89gVC2OijfG0h5Xgq5_M8d17RvQjaRDPA1EN5M3Os8HfND2FFxEjXpM9paVRRpYL-NeRJ_o-iIUgF1g6jePSRcMmDqfdr3M3wi/s640/serve.png&quot; title=&quot;laravel local server&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;Running&lt;/i&gt; Laravel &lt;i&gt;Local Server&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&quot;Good programmer write code for machine, great programmer write code for other programmer&quot;&lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/1991369388531688175/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2017/05/hello-laravel.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1991369388531688175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1991369388531688175'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2017/05/hello-laravel.html' title='Hello Laravel!'/><author><name>Aditya Nursyahbani</name><uri>http://www.blogger.com/profile/07325213218049741746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTpoUrcVoSJHVanvhqCggtaov04yK6-3r_c3wRwWTa-ADRHKl5ZdFyYM_VXKVHST3BoEN5oUFsAjIXk9x_YbKEcc4eBdbd4JuWjCvPsWiZqs7NDDi9oXLU-mdIWFfTw/s220/SAM_1082.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRZWxbv5PSSwAGPa0r3lDZ1zsiGv2a0MHg1_Er7MmoDfv5sYMprOUWcn-tEF_b8dbVb_XJEVW-UFocmWZg4uq-AQKN_pV7yK3sHCCw8JldBtmx_1TIsbu8eVNlpPK6EXIiQwjsyzORjeN1/s72-c/Laravel_logo.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-257880342658426534</id><published>2016-10-19T15:10:00.001+07:00</published><updated>2019-02-04T22:24:49.674+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CodeIgniter"/><category scheme="http://www.blogger.com/atom/ns#" term="Pemrograman"/><title type='text'>Tutorial OAuth2 dengan CodeIgniter</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBUaSMhfFcFNq5KqRNNc-OCbsqDtcyv45-jnGpRe_q65GgoOb8Gyy1ul_Z4CT_K6N-OEGIto02H041Is5r8Zcs2Fei4wL_Chf9XGOgV0hkAsrhTUtnM_MGOBYP5Cy_921Oiapbufo5eECS/s1600/oauth-2-sm.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBUaSMhfFcFNq5KqRNNc-OCbsqDtcyv45-jnGpRe_q65GgoOb8Gyy1ul_Z4CT_K6N-OEGIto02H041Is5r8Zcs2Fei4wL_Chf9XGOgV0hkAsrhTUtnM_MGOBYP5Cy_921Oiapbufo5eECS/s1600/oauth-2-sm.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Pada kesempatan kali ini, saya akan membahas cara menggunakan OAuth (&lt;i&gt;Open standard for Authentification&lt;/i&gt;) versi 2 pada framework CodeIgniter. Sebelumnya apa itu OAuth2? OAuth2 merupakan pengembangan dari OAuth versi pertama, yaitu sebuah protokol atau framework untuk mengamankan resource (biasanya &lt;i&gt;webservice&lt;/i&gt;) dengan mengotorisasi penggunanya sebelum dapat menggunakan &lt;i&gt;resource&lt;/i&gt; tersebut.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Persiapan :&lt;/h3&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://adf.ly/1evJcG&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;CodeIgniter 3.1.0.zip&lt;/a&gt;.&amp;nbsp;(versi CodeIgniter saat dibuatnya artikel ini)&lt;/li&gt;
&lt;li&gt;Kita akan menggunakan library&lt;a href=&quot;http://adf.ly/1evJoa&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt; OAuth2 Server CodeIgniter&lt;/a&gt; yang telah disediakan oleh&amp;nbsp;bshaffer.&lt;/li&gt;
&lt;li&gt;Dump table mysql &lt;a href=&quot;http://adf.ly/1exB49&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;oauth2.sql&lt;/a&gt;&amp;nbsp;dan &lt;a href=&quot;http://adf.ly/1exCdf&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;country.sql&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kita akan menggunakan library &lt;a href=&quot;http://adf.ly/1exAdA&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;CodeIgniter Rest Client&lt;/a&gt; milik Phil Sturgeon untuk membuat API&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Langkah-Langkah :&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
Ekstrak CodeIgniter 3.1.0.zip, letakkan di document root web server anda, rename foldernya menjadi ci-oauth2&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Ekstrak library OAuth2 Server CodeIgniter dan rename nama foldernya menjadi oauth2, letakkan folder tersebut pada direktori library CodeIgniter (application/libraries/)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Kita akan melakukan instalasi oauth2-server-php dengan composer, buka terminal / console, ubah directory ke application/libararies/oauth2, ketikkan :&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;composer install&lt;/pre&gt;
&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0DSmyxGX_0XDHb9JzFNxpKDPJKpGPYE_xH4M2hrP3JYJd28g4WWZodEevYkvXOFCMcYfK0C8AhhWDKEtldXZc56jZYqT3Cjh2z4anZJhvbBf4ca4q4P0liNQjf4tqvMB2L8EX_h3U0t1n/s1600/composer.tiff&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;369&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0DSmyxGX_0XDHb9JzFNxpKDPJKpGPYE_xH4M2hrP3JYJd28g4WWZodEevYkvXOFCMcYfK0C8AhhWDKEtldXZc56jZYqT3Cjh2z4anZJhvbBf4ca4q4P0liNQjf4tqvMB2L8EX_h3U0t1n/s640/composer.tiff&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Install OAuth2 Server PHP via Composer&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
Bagi yang kesulitan menginstall via composer, &amp;nbsp;saya memberikan link lengkap source code di bagian akhir artikel ini.&lt;br /&gt;
&lt;br /&gt;
Buat library CodeIgniter dengan nama Server.php (application/libraries/Server.php), ketikkan listing perintah berikut:&lt;br /&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; filename: &#39;Server.php&#39;&quot; style=&quot;margin: 0px;&quot;&gt;&amp;lt;?php
/**
* @package     Server.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/
date_default_timezone_set(&#39;Asia/Jakarta&#39;);

class Server{
 function __construct($config=array()){
  require_once(__DIR__.&#39;/../config/database.php&#39;);       
  require_once(__DIR__.&#39;/../libraries/oauth2/src/OAuth2/Autoloader.php&#39;); 
  $config = $db[&#39;oauth&#39;];
  
  OAuth2Autoloader::register();
  $this-&amp;gt;storage = new OAuth2StoragePdo(array(&#39;dsn&#39; =&amp;gt; $config[&quot;dsn&quot;], &#39;username&#39; =&amp;gt; $config[&quot;username&quot;], &#39;password&#39; =&amp;gt; $config[&quot;password&quot;]));
  $this-&amp;gt;server = new OAuth2Server($this-&amp;gt;storage, array(&#39;allow_implicit&#39; =&amp;gt; true));
  $this-&amp;gt;request = OAuth2Request::createFromGlobals();
  $this-&amp;gt;response = new OAuth2Response();
 }

 /**
 * client_credentials
 */
 public function client_credentials(){
  $this-&amp;gt;server-&amp;gt;addGrantType(new OAuth2GrantTypeClientCredentials($this-&amp;gt;storage, array(
      &quot;allow_credentials_in_request_body&quot; =&amp;gt; true
  )));
  $this-&amp;gt;server-&amp;gt;handleTokenRequest($this-&amp;gt;request)-&amp;gt;send();
 }

 /**
 * password_credentials
 */
 public function password_credentials(){
  $users = array(&quot;adit&quot; =&amp;gt; array(&quot;password&quot; =&amp;gt; &#39;pass&#39;, &#39;first_name&#39; =&amp;gt; &#39;homeway&#39;, &#39;last_name&#39; =&amp;gt; &#39;yao&#39;));
  $storage = new OAuth2StorageMemory(array(&#39;user_credentials&#39; =&amp;gt; $users));
  $this-&amp;gt;server-&amp;gt;addGrantType(new OAuth2GrantTypeUserCredentials($storage));
  $this-&amp;gt;server-&amp;gt;handleTokenRequest($this-&amp;gt;request)-&amp;gt;send();
 }

 /**
 * refresh_token
 */
 public function refresh_token(){
  $this-&amp;gt;server-&amp;gt;addGrantType(new OAuth2GrantTypeRefreshToken($this-&amp;gt;storage, array(
   &quot;always_issue_new_refresh_token&quot; =&amp;gt; true,
   &quot;unset_refresh_token_after_use&quot; =&amp;gt; true,
   &quot;refresh_token_lifetime&quot; =&amp;gt; 2419200,
  )));
  $this-&amp;gt;server-&amp;gt;handleTokenRequest($this-&amp;gt;request)-&amp;gt;send();
 }

 /**
 * limit scope
 */
 public function require_scope($scope=&quot;&quot;){
  if (!$this-&amp;gt;server-&amp;gt;verifyResourceRequest($this-&amp;gt;request, $this-&amp;gt;response, $scope)) {
      $this-&amp;gt;server-&amp;gt;getResponse()-&amp;gt;send();
      die;
  }
 }

 public function check_client_id(){
  if (!$this-&amp;gt;server-&amp;gt;validateAuthorizeRequest($this-&amp;gt;request, $this-&amp;gt;response)) {
      $this-&amp;gt;response-&amp;gt;send();
      die;
  }
 }

 public function authorize($is_authorized){
  $this-&amp;gt;server-&amp;gt;addGrantType(new OAuth2GrantTypeAuthorizationCode($this-&amp;gt;storage));
  $this-&amp;gt;server-&amp;gt;handleAuthorizeRequest($this-&amp;gt;request, $this-&amp;gt;response, $is_authorized);
  if ($is_authorized) {
     $code = substr($this-&amp;gt;response-&amp;gt;getHttpHeader(&#39;Location&#39;), strpos($this-&amp;gt;response-&amp;gt;getHttpHeader(&#39;Location&#39;), &#39;code=&#39;)+5, 40);
     header(&quot;Location: &quot;.$this-&amp;gt;response-&amp;gt;getHttpHeader(&#39;Location&#39;));
    }
  $this-&amp;gt;response-&amp;gt;send();
 }

 public function authorization_code(){
  $this-&amp;gt;server-&amp;gt;addGrantType(new OAuth2GrantTypeAuthorizationCode($this-&amp;gt;storage));
  $this-&amp;gt;server-&amp;gt;handleTokenRequest($this-&amp;gt;request)-&amp;gt;send();
 }
}
 /**
 * password_credentials
 */
 public function password_credentials(){
  $users = array(&quot;user&quot; =&amp;gt; array(&quot;password&quot; =&amp;gt; &#39;pass&#39;, &#39;first_name&#39; =&amp;gt; &#39;aditya&#39;, &#39;last_name&#39; =&amp;gt; &#39;nursyahbani&#39;));
  $storage = new OAuth2\Storage\Memory(array(&#39;user_credentials&#39; =&amp;gt; $users));
  $this-&amp;gt;server-&amp;gt;addGrantType(new OAuth2\GrantType\UserCredentials($storage));
  $this-&amp;gt;server-&amp;gt;handleTokenRequest($this-&amp;gt;request)-&amp;gt;send();
 }

 /**
 * refresh_token
 */
 public function refresh_token(){
  $this-&amp;gt;server-&amp;gt;addGrantType(new OAuth2\GrantType\RefreshToken($this-&amp;gt;storage, array(
   &quot;always_issue_new_refresh_token&quot; =&amp;gt; true,
   &quot;unset_refresh_token_after_use&quot; =&amp;gt; true,
   &quot;refresh_token_lifetime&quot; =&amp;gt; 2419200,
  )));
  $this-&amp;gt;server-&amp;gt;handleTokenRequest($this-&amp;gt;request)-&amp;gt;send();
 }

 /**
 * limit scope
 */
 public function require_scope($scope=&quot;&quot;){
  if (!$this-&amp;gt;server-&amp;gt;verifyResourceRequest($this-&amp;gt;request, $this-&amp;gt;response, $scope)) {
      $this-&amp;gt;server-&amp;gt;getResponse()-&amp;gt;send();
      die;
  }
 }

 public function check_client_id(){
  if (!$this-&amp;gt;server-&amp;gt;validateAuthorizeRequest($this-&amp;gt;request, $this-&amp;gt;response)) {
      $this-&amp;gt;response-&amp;gt;send();
      die;
  }
 }

 public function authorize($is_authorized){
  $this-&amp;gt;server-&amp;gt;addGrantType(new OAuth2\GrantType\AuthorizationCode($this-&amp;gt;storage));
  $this-&amp;gt;server-&amp;gt;handleAuthorizeRequest($this-&amp;gt;request, $this-&amp;gt;response, $is_authorized);
  if ($is_authorized) {
     $code = substr($this-&amp;gt;response-&amp;gt;getHttpHeader(&#39;Location&#39;), strpos($this-&amp;gt;response-&amp;gt;getHttpHeader(&#39;Location&#39;), &#39;code=&#39;)+5, 40);
     header(&quot;Location: &quot;.$this-&amp;gt;response-&amp;gt;getHttpHeader(&#39;Location&#39;));
    }
  $this-&amp;gt;response-&amp;gt;send();
 }

 public function authorization_code(){
  $this-&amp;gt;server-&amp;gt;addGrantType(new OAuth2\GrantType\AuthorizationCode($this-&amp;gt;storage));
  $this-&amp;gt;server-&amp;gt;handleTokenRequest($this-&amp;gt;request)-&amp;gt;send();
 }
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Ekstrak file Codeigniter Rest Client sesuai dengan direktorinya masing pada folder ci-oauth2&lt;br /&gt;
&lt;br /&gt;
Pada artikel ini menggunakan database mysql, buat tabel database dengan nama oauth2, buka phpmyadmin/consol dan import file oauth2.sql dan country.sql ke tabel oauth2.&lt;br /&gt;
&lt;br /&gt;
Konfigurasi koneksi database dengan codeigniter, buka file database.php yang terletak pada direktori &lt;i&gt;application/config&lt;/i&gt;. Tambahkan baris berikut:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; filename: &#39;database.php&#39;&quot; style=&quot;margin: 0px;&quot;&gt;$db[&#39;oauth&#39;] = array(
 &#39;dsn&#39; =&amp;gt; &#39;mysql:dbname=oauth2;host=127.0.0.1&#39;,
 &#39;hostname&#39; =&amp;gt; &#39;localhost&#39;,
 &#39;username&#39; =&amp;gt; &#39;USERNAME_DB_HERE&#39;,
 &#39;password&#39; =&amp;gt; &#39;PASSWORD_DB_HERE&#39;,
 &#39;database&#39; =&amp;gt; &#39;oauth2&#39;,
 &#39;dbdriver&#39; =&amp;gt; &#39;pdo&#39;,
 &#39;dbprefix&#39; =&amp;gt; &#39;&#39;,
 &#39;pconnect&#39; =&amp;gt; FALSE,
 &#39;db_debug&#39; =&amp;gt; (ENVIRONMENT !== &#39;production&#39;),
 &#39;cache_on&#39; =&amp;gt; FALSE,
 &#39;cachedir&#39; =&amp;gt; &#39;&#39;,
 &#39;char_set&#39; =&amp;gt; &#39;utf8&#39;,
 &#39;dbcollat&#39; =&amp;gt; &#39;utf8_general_ci&#39;,
 &#39;swap_pre&#39; =&amp;gt; &#39;&#39;,
 &#39;encrypt&#39; =&amp;gt; FALSE,
 &#39;compress&#39; =&amp;gt; FALSE,
 &#39;stricton&#39; =&amp;gt; FALSE,
 &#39;failover&#39; =&amp;gt; array(),
 &#39;save_queries&#39; =&amp;gt; TRUE
);
&lt;/pre&gt;
Buat direktori dengan nama Oauth2 pada direktori application/controllers, buat controller-controller berikut:&lt;br /&gt;
&lt;b&gt;Authorize.php
&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; filename: &#39;Authorize.php&#39;&quot; style=&quot;margin: 0px;&quot;&gt;&amp;lt;?php
/**
* @package     Authorize.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/

defined(&#39;BASEPATH&#39;) OR exit(&#39;No direct script access allowed&#39;);

class Authorize extends CI_Controller {
    function __construct(){
        @session_start();
        parent::__construct();
        $this-&amp;gt;load-&amp;gt;library(&quot;Server&quot;, &quot;server&quot;);
    }

    function index(){
        $scope = $this-&amp;gt;input-&amp;gt;get(&quot;scope&quot;);
        $state = $this-&amp;gt;input-&amp;gt;get(&quot;state&quot;);
        $client_id = $this-&amp;gt;input-&amp;gt;get(&quot;client_id&quot;);
        $redirect_uri = $this-&amp;gt;input-&amp;gt;get(&quot;redirect_uri&quot;);
        $response_type = $this-&amp;gt;input-&amp;gt;get(&quot;response_type&quot;);

        if(!isset($_POST[&quot;authorized&quot;])){
            $this-&amp;gt;server-&amp;gt;check_client_id();
            $data = array(
                &quot;scope&quot; =&amp;gt; $scope,
                &quot;state&quot; =&amp;gt; $state,
                &quot;client_id&quot; =&amp;gt; $client_id,
                &quot;redirect_uri&quot; =&amp;gt; $redirect_uri,
                &quot;response_type&quot; =&amp;gt; $response_type,
            );
            $this-&amp;gt;load-&amp;gt;view(&quot;oauth2/authorize&quot;, $data);
        }else{
            $authorized = $this-&amp;gt;input-&amp;gt;post(&quot;authorized&quot;);
            if($authorized === &quot;yes&quot;){
                $this-&amp;gt;server-&amp;gt;authorize(($authorized === &quot;yes&quot;));
            }else{
                echo &quot;error&quot;;
            }
        }
    }

    function token(){
        $this-&amp;gt;server-&amp;gt;authorization_code(&quot;yes&quot;);
    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;ClientCredentials.php
&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; filename: &#39;ClientCredentials.php&#39;&quot; style=&quot;margin: 0px;&quot;&gt;&amp;lt;?php
/**
* @package     ClientCredentials.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/

defined(&#39;BASEPATH&#39;) OR exit(&#39;No direct script access allowed&#39;);

class ClientCredentials extends CI_Controller {
    function __construct(){
        @session_start();
        parent::__construct();
        $this-&amp;gt;load-&amp;gt;library(&quot;Server&quot;, &quot;server&quot;);
    }    

    function index(){
        $this-&amp;gt;server-&amp;gt;client_credentials();
    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;PasswordCredentials.php
&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; filename: &#39;PasswordCredentials.php&#39;&quot; style=&quot;margin: 0px;&quot;&gt;&amp;lt;?php
/**
* @package     PasswordCredentials.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/
defined(&#39;BASEPATH&#39;) OR exit(&#39;No direct script access allowed&#39;);

class PasswordCredentials extends CI_Controller {
    function __construct(){
        @session_start();
        parent::__construct();
        $this-&amp;gt;load-&amp;gt;library(&quot;Server&quot;, &quot;server&quot;);
    }    

    function index(){
        $this-&amp;gt;server-&amp;gt;password_credentials();
    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;RefreshToken.php
&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; filename: &#39;RefreshToken.php&#39;&quot; style=&quot;margin: 0px;&quot;&gt;&amp;lt;?php
/**
* @package     RefreshToken.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/
defined(&#39;BASEPATH&#39;) OR exit(&#39;No direct script access allowed&#39;);

class RefreshToken extends CI_Controller {
    function __construct(){
        @session_start();
        parent::__construct();
        $this-&amp;gt;load-&amp;gt;library(&quot;Server&quot;, &quot;server&quot;);
    }    

    function index(){
        $this-&amp;gt;server-&amp;gt;refresh_token();
    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Test.php
&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; filename: &#39;Test.php&#39;&quot; style=&quot;margin: 0px;&quot;&gt;&amp;lt;?php
/**
* @package     Test.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/

defined(&#39;BASEPATH&#39;) OR exit(&#39;No direct script access allowed&#39;);

class Test extends CI_Controller {
    function __construct(){
        @session_start();
        parent::__construct();
    }

    function index(){
     $this-&amp;gt;load-&amp;gt;view(&quot;oauth2/api&quot;);
    }

}
&lt;/pre&gt;
&lt;br /&gt;
Buatlah direktori dengan nama oauth2 pada direktori&amp;nbsp;&lt;i&gt;application/views&lt;/i&gt;&amp;nbsp;kemudian buatlah view berikut didalam direktori oauth2&amp;nbsp;:&lt;br /&gt;
&lt;b&gt;api.php&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;; filename: &#39;Test.php&#39;&quot; style=&quot;margin: 0px;&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;title&amp;gt;CodeIgniter OAuth2 Tutorial&amp;lt;/title&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1, maximum-scale=1&quot;&amp;gt;
    &amp;lt;meta name=&quot;description&quot; content=&quot;CodeIgniter OAuth2 Tutorial&quot;&amp;gt;
    &amp;lt;meta property=&quot;og:type&quot; content=&quot;website&quot;&amp;gt;
    &amp;lt;meta property=&quot;og:title&quot; content=&quot;CodeIgniter OAuth2 Tutorial&quot;&amp;gt;
    &amp;lt;meta property=&quot;og:url&quot; content=&quot;http://homeway.me&quot;&amp;gt;
    &amp;lt;meta property=&quot;og:site_name&quot; content=&quot;CodeIgniter OAuth2 Tutorial&quot;&amp;gt;
    &amp;lt;meta property=&quot;og:description&quot; content=&quot;CodeIgniter OAuth2 Tutorial&quot;&amp;gt;
    &amp;lt;meta name=&quot;twitter:title&quot; content=&quot;@adit_gudhel&quot;&amp;gt;
    &amp;lt;link rel=&quot;publisher&quot; href=&quot;aditya nursyahbani&quot;&amp;gt;
    &amp;lt;link href=&quot;http://cdn.bootcss.com/bootstrap/3.3.4/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;row&quot;&amp;gt;
    &amp;lt;div class=&quot;col-md-2&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;col-md-8&quot;&amp;gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
        &amp;lt;form class=&quot;form-inline&quot;&amp;gt;
            &amp;lt;h1&amp;gt;1. Request Access Token (Grant Type)&amp;lt;/h1&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

            &amp;lt;div class=&quot;form-group&quot;&amp;gt;
                &amp;lt;label for=&quot;Credentials&quot;&amp;gt;&amp;lt;h3&amp;gt;Resource Owner Password Credentials:&amp;lt;/h3&amp;gt;&amp;lt;br&amp;gt;
                    &amp;lt;div&amp;gt;Param：&amp;lt;code&amp;gt;{ grant_type: &quot;password&quot;, username: &quot;adit&quot;, password: &quot;pass&quot;, client_id: &#39;client&#39;, client_secret:&#39;mysecret&#39;, scope:&#39;country&#39; }&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;
                    &amp;lt;div&amp;gt;Result:&amp;lt;code id=&quot;return-PasswordCredentials&quot;&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;a id=&quot;btn-PasswordCredentials&quot; class=&quot;btn btn-success&quot;&amp;gt;Get PasswordCredentials&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

            &amp;lt;div class=&quot;form-group&quot;&amp;gt;
                &amp;lt;label for=&quot;ClientCredentials&quot;&amp;gt;&amp;lt;h3&amp;gt;Client Credentials: &amp;lt;/h3&amp;gt;&amp;lt;br&amp;gt;
                    &amp;lt;div&amp;gt;Param:&amp;lt;code&amp;gt;{client_id: &#39;client&#39;, client_secret:&#39;mysecret&#39;, grant_type:&#39;client_credentials&#39;, scope:&#39;country&#39;}&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;
                    &amp;lt;div&amp;gt;Result:&amp;lt;code id=&quot;return-ClientCredentials&quot;&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;a id=&quot;btn-ClientCredentials&quot; class=&quot;btn btn-success&quot;&amp;gt;Get ClientCredentials&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

            &amp;lt;div class=&quot;form-group&quot;&amp;gt;
                &amp;lt;label for=&quot;authorize&quot;&amp;gt;
                    &amp;lt;h3&amp;gt;Access_token（Authorization Code）:&amp;lt;/h3&amp;gt;
                    &amp;lt;div&amp;gt;Param：&amp;lt;code&amp;gt;{code: &quot;Authorize code&quot;, client_id: &#39;client&#39;, client_secret:&#39;mysecret&#39;, password:&#39;pass&#39;, grant_type: &#39;authorization_code&#39;, scope:&#39;country&#39;}&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;
                    &amp;lt;div&amp;gt;Result：&amp;lt;code id=&quot;return-Authorize&quot;&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;
                    &amp;lt;div&amp;gt;Link Auth &amp;lt;a target=&quot;_blank&quot; href=&quot;/ci-oauth2/oauth2/authorize?response_type=code&amp;amp;client_id=client&amp;amp;redirect_uri=http://www.aditya-nursyahbani.net&amp;amp;state=xyz&amp;amp;scope=country&quot;&amp;gt;/ci-oauth2/oauth2/authorize?response_type=code&amp;amp;client_id=client&amp;amp;redirect_uri=&amp;lt;?=base_url(&#39;oauth2/test&#39;);?&amp;gt;&amp;amp;state=xxx&amp;amp;scope=country&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;authorize-code&quot; placeholder=&quot;Authorize code&quot;&amp;gt;
                &amp;lt;a id=&quot;btn-authorize&quot; class=&quot;btn btn-success&quot;&amp;gt;Get Authorize Access Token&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
            &amp;lt;div class=&quot;form-group&quot;&amp;gt;
                &amp;lt;label for=&quot;authorize&quot;&amp;gt;
                    &amp;lt;h3&amp;gt;Implicit Grant:&amp;lt;/h3&amp;gt;&amp;lt;br&amp;gt;
                    &amp;lt;div&amp;gt;Authorization Code Access Token&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;/label&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
            &amp;lt;h1&amp;gt;2. Access Token &amp;lt;/h1&amp;gt;
            &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

            &amp;lt;div class=&quot;form-group&quot;&amp;gt;
                &amp;lt;label for=&quot;refresh-token&quot;&amp;gt;
                    &amp;lt;h3&amp;gt;Refresh Access Token&amp;lt;/h3&amp;gt;&amp;lt;br&amp;gt;
                    &amp;lt;div&amp;gt;Param：&amp;lt;code&amp;gt;{refresh_token: &quot;Refresh Token&quot;, client_id: &#39;client&#39;, client_secret:&#39;mysecret&#39;, grant_type:&#39;refresh_token&#39;, scope:&#39;country&#39;}&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;
                    &amp;lt;div&amp;gt;Result: &amp;lt;code id=&quot;return-refresh-token&quot;&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;input type=&quot;text&quot; class=&quot;form-control refresh-token&quot; id=&quot;old_token&quot; placeholder=&quot;Refresh Token&quot;&amp;gt;
                &amp;lt;a id=&quot;btn-refresh&quot; class=&quot;btn btn-success&quot;&amp;gt;From Refresh Token Get Access Token&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

            &amp;lt;div class=&quot;form-group&quot;&amp;gt;
                &amp;lt;label for=&quot;resource&quot;&amp;gt;
                    &amp;lt;h3&amp;gt;From Access Token get Resource&amp;lt;/h3&amp;gt;&amp;lt;br&amp;gt;
                    &amp;lt;div&amp;gt;Param：&amp;lt;code&amp;gt;{ access_token: &quot;Access Token&quot;}&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;
                    &amp;lt;div&amp;gt;Result: &amp;lt;code id=&quot;return-resource&quot;&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;input type=&quot;text&quot; class=&quot;form-control token&quot; id=&quot;resource&quot; placeholder=&quot;Resource&quot;&amp;gt;
                &amp;lt;a id=&quot;btn-resource&quot; class=&quot;btn btn-success&quot;&amp;gt;Get Resource&amp;lt;/a&amp;gt;
                &amp;lt;a id=&quot;btn-resource-limit&quot; class=&quot;btn btn-success&quot;&amp;gt;Get Resource With Scope Error&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script src=&quot;http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
$(document).ready(function(){
    $(&quot;#btn-refresh&quot;).click(function (e){
        var data = {refresh_token: $(&quot;#old_token&quot;).val(), client_id: &#39;client&#39;, client_secret:&#39;mysecret&#39;, grant_type:&#39;refresh_token&#39;, scope:&#39;country&#39;};
        
        $.post(&#39;/ci-oauth2/oauth2/RefreshToken&#39;, data, function (d){
            console.log(&quot;Get Token =&amp;gt; &quot;, d);
            $(&#39;#return-refresh-token&#39;).html(JSON.stringify(d));
        });
    }); 

    $(&#39;#btn-authorize&#39;).click(function (e){
        var data = {code: $(&quot;#authorize-code&quot;).val(), client_id: &#39;client&#39;, client_secret:&#39;mysecret&#39;, redirect_uri:&quot;http://www.aditya-nursyahbani.net&quot;, grant_type: &#39;authorization_code&#39;, scope:&#39;country&#39;};
        $.post(&#39;/ci-oauth2/oauth2/authorize/token&#39;, data, function (d){
            $(&quot;.refresh-token&quot;).val(d.refresh_token);
            console.log(&quot;Get Authorize Access Token =&amp;gt; &quot;, d);
            $(&#39;#return-Authorize&#39;).html(JSON.stringify(d));
        },&quot;json&quot;);
    });

    $(&#39;#btn-resource&#39;).click(function (e){
        var data = { access_token: $(&quot;#resource&quot;).val()};
        
        $.post(&#39;/ci-oauth2/api/countries&#39;, data, function (d){
            console.log(&quot;Get Authorize =&amp;gt; &quot;, d);
            $(&#39;#return-resource&#39;).html(JSON.stringify(d));
        },&quot;json&quot;);      
    });

    $(&#39;#btn-resource-limit&#39;).click(function (e){
        var data = { access_token: $(&quot;#resource&quot;).val()};
        
        $.post(&#39;/ci-oauth2/oauth2/resource/limit&#39;, data, function (d){
            console.log(&quot;Get Authorize =&amp;gt; &quot;, d);
            $(&#39;#return-resource&#39;).html(JSON.stringify(d));
        },&quot;json&quot;);      
    });

    $(&#39;#btn-PasswordCredentials&#39;).click(function (e){
        var data = { grant_type: &quot;password&quot;, username: &quot;adit&quot;, password: &quot;pass&quot;, client_id: &#39;client&#39;, client_secret:&#39;mysecret&#39;, scope:&#39;country&#39; };
        $.post(&#39;/ci-oauth2/oauth2/PasswordCredentials&#39;, data, function (d){
            console.log(&quot;Get Access Token from client credentials =&amp;gt; &quot;, d);
            $(&quot;.refresh-token&quot;).val(d.refresh_token);
            $(&quot;.token&quot;).val(d.access_token);
            $(&#39;#return-PasswordCredentials&#39;).html(JSON.stringify(d));
        },&quot;json&quot;);
    });

    $(&quot;#btn-ClientCredentials&quot;).click(function (e){
        var data = {client_id: &#39;client&#39;, client_secret:&#39;mysecret&#39;, grant_type:&#39;client_credentials&#39;, scope:&#39;country&#39;};
        $.post(&#39;/ci-oauth2/oauth2/ClientCredentials&#39;, data, function (d){
            //d = d.JSON.parse(d);
            console.log(&quot;Get Access Token from password credentials =&amp;gt; &quot;, d);
            $(&quot;.token&quot;).val(d.access_token);
            $(&#39;#return-ClientCredentials&#39;).html(JSON.stringify(d));
        }, &quot;json&quot;);
    });
});
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;authorize.php&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; filename: &#39;Test.php&#39;&quot; style=&quot;margin: 0px;&quot;&gt;&amp;lt;?php
$action = &quot;/ci-oauth2/oauth2/Authorize?response_type=&quot;.$response_type.&quot;&amp;amp;client_id=&quot;.$client_id.&quot;&amp;amp;redirect_uri=&quot;.$redirect_uri.&quot;&amp;amp;state=&quot;.$state.&quot;&amp;amp;scope=&quot;.$scope;
?&amp;gt;

&amp;lt;body&amp;gt;
&amp;lt;div style=&quot;text-align:center;&quot;&amp;gt;
  &amp;lt;form method=&quot;post&quot;&amp;gt;
       &amp;lt;div class=&quot;oauth_content&quot; node-type=&quot;commonlogin&quot;&amp;gt;
         &amp;lt;p class=&quot;oauth_main_info&quot;&amp;gt;Authorisasi?  &amp;lt;a href=&quot;http://www.aditya-nursyahbani.net/&quot;  target=&quot;_blank&quot; class=&quot;app_name&quot;&amp;gt;Ditya&#39;s Life&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
   &amp;lt;input name=&quot;authorized&quot; value=&quot;yes&quot; hidden&amp;gt;
   &amp;lt;button&amp;gt;submit&amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
    &amp;lt;/form&amp;gt;
  
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
Finally buatlah controller dengan nama Api.php fungsinya untuk membuat service-service apa saja yg mau diprovide / disediakan oleh web service, pada artikel ini kita mengambil contoh listing nama-nama negara. Ketikkan listing program berikut:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; filename: &#39;Test.php&#39;&quot; style=&quot;margin: 0px;&quot;&gt;&amp;lt;?php
/**
* @package     Api.php
* @author      Aditya Nursyahbani
* @link        http://www.aditya-nursyahbani.net/2016/10/tutorial-oauth2-dengan-codeigniter.html
* @copyright   Copyright(c) 2016
* @version     1.0.0
**/

defined(&#39;BASEPATH&#39;) OR exit(&#39;No direct script access allowed&#39;);

require(APPPATH . &#39;libraries/REST_Controller.php&#39;);
 
class Api extends REST_Controller {

 function __construct(){
        @session_start();
        parent::__construct();
        $this-&amp;gt;load-&amp;gt;library(&quot;Server&quot;, &quot;server&quot;);
     $this-&amp;gt;server-&amp;gt;require_scope(&quot;country&quot;);

        $this-&amp;gt;load-&amp;gt;database(&#39;oauth&#39;);
     $this-&amp;gt;load-&amp;gt;model(&#39;country_model&#39;);
    }

 function country_get(){
  if(!$this-&amp;gt;get(&#39;id&#39;)) {
            $this-&amp;gt;response(NULL, 400);
        }
 
        $country = $this-&amp;gt;country_model-&amp;gt;get($this-&amp;gt;get(&#39;id&#39;));
         
        if($country) {
            $this-&amp;gt;response($country, 200); // 200 being the HTTP response code
        } else {
            $this-&amp;gt;response(NULL, 404);
        }
 } 

 function countries_post(){
  $country = $this-&amp;gt;country_model-&amp;gt;get_all();
         
        if($country) {
            $this-&amp;gt;response($country, 200); // 200 being the HTTP response code
        } else {
            $this-&amp;gt;response(NULL, 404);
        }
 } 

}&lt;/pre&gt;
&lt;br /&gt;
Untuk mencoba oauth2nya ketikkan alamat &lt;b&gt;&lt;i&gt;http://localhost/ci-oauth2/oauth2/test&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizACSKy8iGrbqjXetyLWUeXkmjH3rfuyx0xxQK2rShcRdKFth6u9qECA7Z-NlOVlHjzRxSP7v35BDDkOFsbL5mxMogbP_sYBBD9SzEnxQnLERjVwE9eoiI-dXzOUQenADTkGrycKmQnim2/s1600/rat.tiff&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;339&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizACSKy8iGrbqjXetyLWUeXkmjH3rfuyx0xxQK2rShcRdKFth6u9qECA7Z-NlOVlHjzRxSP7v35BDDkOFsbL5mxMogbP_sYBBD9SzEnxQnLERjVwE9eoiI-dXzOUQenADTkGrycKmQnim2/s640/rat.tiff&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBUJFQjGbOainalmsOEnxyofeM3E68cmitNQfZWieGoW5AS-EVofqfUu0wgy-tZxRe9oQkKAmkClHBGL8IK_XjwgB4V8SO9Y5q97ds9D0tDyHRN0_uI9cix2i2C_ekWG0csKkb9lez4AF_/s1600/rat2.tiff&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;340&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBUJFQjGbOainalmsOEnxyofeM3E68cmitNQfZWieGoW5AS-EVofqfUu0wgy-tZxRe9oQkKAmkClHBGL8IK_XjwgB4V8SO9Y5q97ds9D0tDyHRN0_uI9cix2i2C_ekWG0csKkb9lez4AF_/s640/rat2.tiff&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;

Download full &lt;i&gt;source code&lt;/i&gt;&amp;nbsp;pada artikel ini :
&lt;/h3&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://adf.ly/1exD71&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/257880342658426534/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2016/10/tutorial-oauth2-dengan-codeigniter.html#comment-form' title='5 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/257880342658426534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/257880342658426534'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2016/10/tutorial-oauth2-dengan-codeigniter.html' title='Tutorial OAuth2 dengan CodeIgniter'/><author><name>Aditya Nursyahbani</name><uri>http://www.blogger.com/profile/07325213218049741746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTpoUrcVoSJHVanvhqCggtaov04yK6-3r_c3wRwWTa-ADRHKl5ZdFyYM_VXKVHST3BoEN5oUFsAjIXk9x_YbKEcc4eBdbd4JuWjCvPsWiZqs7NDDi9oXLU-mdIWFfTw/s220/SAM_1082.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBUaSMhfFcFNq5KqRNNc-OCbsqDtcyv45-jnGpRe_q65GgoOb8Gyy1ul_Z4CT_K6N-OEGIto02H041Is5r8Zcs2Fei4wL_Chf9XGOgV0hkAsrhTUtnM_MGOBYP5Cy_921Oiapbufo5eECS/s72-c/oauth-2-sm.png" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-1147203846837409172</id><published>2016-10-16T23:40:00.002+07:00</published><updated>2019-02-04T22:07:55.981+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Mac OS"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>Install mcrypt di Mac OS X Sierra</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLudrFm5k4gW0qPt7tuMR0jSTDP1SyAessn83UOAMW6_tMCStKr7m0BObiUPWT32LaRIrFH9qswJH2IdNs93Al_BILmwczcHJzIyOoS3KLlKMshcp2FPodqJkMFOap8i98rdmSIPOuQ1Ep/s1600/5540c8689bddf5282d409fd3b35fa99c.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;177&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLudrFm5k4gW0qPt7tuMR0jSTDP1SyAessn83UOAMW6_tMCStKr7m0BObiUPWT32LaRIrFH9qswJH2IdNs93Al_BILmwczcHJzIyOoS3KLlKMshcp2FPodqJkMFOap8i98rdmSIPOuQ1Ep/s320/5540c8689bddf5282d409fd3b35fa99c.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Belum lama ini apple merilis sistem operasi baru (Operation System) Mac OS X Sierra. Banyak fitur-fitur baru yang ditawarkan dalam sierra ini. Bagi para developer Web, ternyata &lt;i&gt;web server&lt;/i&gt; apache bawaan OS ini adalah versi 2.4 dengan PHP versi 5.6.24. Masalah yang sering timbul ketika update OS X salah satunya adalah &lt;i&gt;service&lt;/i&gt; MySQL yang harus dikonfigurasi lagi karena tidak &lt;i&gt;autostart&lt;/i&gt; (berjalan otomatis), sehingga perlu di konfigurasi lagi daemon mysqlnya supaya di &lt;i&gt;load&lt;/i&gt; saat OS X startup.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Penasaran dengan OS X Sierra ini, akhirnya saya melakukan &lt;i&gt;upgrade&lt;/i&gt; OS Macbook Pro. Selain harus mengkonfigurasi ulang &lt;i&gt;service&lt;/i&gt; mysql, permasalahan yg timbul adalah extension Mcrypt atau extension yang biasa digunakan untuk mengenkripsi dan merupakan requirement jika kita mengembangkan web dengan framework Laravel ternyata tidak built in di PHP 5.6.24.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Untuk itu, kita harus melakukan compile dan build extension mcrypt secara manual agar dapat di load di PHP. Berikut ini merupakan langkah-langkanya agar ekstensi / library mcrypt dapat di jalankan:&lt;br /&gt;
&lt;h3&gt;
Install Command Line Tools&lt;/h3&gt;
caranya buka terminal / console ketikkan perintah berikut :&lt;/div&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;;&quot;&gt;xcode-select --install&lt;/pre&gt;
&lt;h3&gt;
Disabled SIP / rootless&lt;/h3&gt;
&lt;div&gt;
nonaktifkan &lt;i&gt;System Integrity Protection&lt;/i&gt; (SIP) untuk mengijinkan akses terhadap folder sistem yg diproteksi. Kita tidak dapat menonaktifkan SIP ini dengan normal boot harus dari recovery boot. Berikut ini caranya:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Restart Mac OS X&lt;/li&gt;
&lt;li&gt;Masuk ke Recovery Booting (pada saat bunyi startup chime, tekan Command + R secara bersamaan sampai masuk ke recovery booting)&lt;/li&gt;
&lt;li&gt;Pilih Utilities -&amp;gt; Terminal&lt;/li&gt;
&lt;li&gt;Ketika masuk jendela terminal, ketikkan :&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;;&quot;&gt;csrutil disable&lt;/pre&gt;
&lt;h3&gt;
Download libmcrypt dan PHP&lt;/h3&gt;
&lt;div&gt;
Download &lt;a href=&quot;http://adf.ly/1etDy9&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;libmcrypt 2.5.8&lt;/a&gt;&amp;nbsp;dan &lt;a href=&quot;http://adf.ly/1etE4U&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;PHP 5.6.24&lt;/a&gt; sesuai dengan versi php built in.&lt;/div&gt;
&lt;div&gt;
Buat folder atau direktori mcrypt di home directory dan pindahkan hasil download ke dalam folder itu.&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;;&quot;&gt;cd ~/
mkdir mcrypt
cd mcrypt&lt;/pre&gt;
Ekstrak hasil download dan remove file gz&lt;br /&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;;&quot;&gt;tar -zxvf libmcrypt-2.5.8.tar.gz
tar -zxvf php-5.6.24.tar.gz&lt;/pre&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;;&quot;&gt;rm *.gz&lt;/pre&gt;
&lt;/div&gt;
&lt;h3&gt;
Konfigurasi libmcrypt&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;;&quot;&gt;cd libmcrypt-2.5.8
./configure
make
sudo make install&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
Install Autoconf&lt;/h3&gt;
&lt;div style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;&quot;&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;cd ~/mcrypt
curl -0 http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
cd autoconf-2.69/
./configure
make install
sudo make install&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;
Compile ekstensi libmcrypt pada PHP&lt;/h3&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;cd ../php-5.6.24/ext/mcrypt/
/usr/bin/phpize
&lt;/pre&gt;
Kira-kira outputnya seperti ini :
&lt;br /&gt;
&lt;blockquote&gt;
PHP Api Version: 20131106&lt;br /&gt;
Zend Module Api No: 20131226&lt;br /&gt;
Zend Extension Api No: 220131226&lt;/blockquote&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;./configure
make
sudo make install
&lt;/pre&gt;
Hasilnya kira-kira seperti ini: &lt;br /&gt;
&lt;blockquote&gt;
Installing shared extensions: /usr/lib/php/extension/no-debug-non-zts-220131226&lt;/blockquote&gt;
&lt;h3&gt;
Mengaktifkan mcrypt di ekstensi PHP (mcrypt.so)&lt;/h3&gt;
Buka php ini (/etc/php.ini), pastikan extension_dl = on dan tambahkan baris berikut di akhir file:&lt;br /&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;extension=mcrypt.so&lt;/pre&gt;
Jika file php.ini tidak ada, lakukan hal berikut:
&lt;br /&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;sudo cp /etc/php.ini.default /etc/php.ini
sudo chmod u+w /etc/php.ini&lt;/pre&gt;
&lt;h3&gt;
Finally restart apache&lt;/h3&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;;&quot; style=&quot;margin: 0px;&quot;&gt;sudo service apache2 restart&lt;/pre&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUx4_nwudbeo_7HhdEwyyuSZmQVXJQYfOq3xZo22Vzt8bylMEU0vmkIlwVP7_1BVTAWp9iaJz8AYT_-MAemD_ThtqVZtz7b88p5pS19uohrVOaoRDLR3f28a0tx2oz3C3PsZQwiVcPem2h/s1600/mcrypt.tiff&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;197&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUx4_nwudbeo_7HhdEwyyuSZmQVXJQYfOq3xZo22Vzt8bylMEU0vmkIlwVP7_1BVTAWp9iaJz8AYT_-MAemD_ThtqVZtz7b88p5pS19uohrVOaoRDLR3f28a0tx2oz3C3PsZQwiVcPem2h/s640/mcrypt.tiff&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/1147203846837409172/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2016/10/install-mcrypt-di-mac-os-x-sierra_16.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1147203846837409172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1147203846837409172'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2016/10/install-mcrypt-di-mac-os-x-sierra_16.html' title='Install mcrypt di Mac OS X Sierra'/><author><name>Aditya Nursyahbani</name><uri>http://www.blogger.com/profile/07325213218049741746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTpoUrcVoSJHVanvhqCggtaov04yK6-3r_c3wRwWTa-ADRHKl5ZdFyYM_VXKVHST3BoEN5oUFsAjIXk9x_YbKEcc4eBdbd4JuWjCvPsWiZqs7NDDi9oXLU-mdIWFfTw/s220/SAM_1082.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLudrFm5k4gW0qPt7tuMR0jSTDP1SyAessn83UOAMW6_tMCStKr7m0BObiUPWT32LaRIrFH9qswJH2IdNs93Al_BILmwczcHJzIyOoS3KLlKMshcp2FPodqJkMFOap8i98rdmSIPOuQ1Ep/s72-c/5540c8689bddf5282d409fd3b35fa99c.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-4416966175709985471</id><published>2013-11-03T01:31:00.000+07:00</published><updated>2019-02-04T21:37:00.935+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>Konfigurasi dan Instalasi Squid Proxy Server di Windows</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2lcSmAzo9M57kErvww14Xo4tFjYb4PckeZjZiMv2dH5_jmRzfDf8ySFOEtCZQgZ2hUSqZXIWraibiZHZpS69DQM_W7S5kwTeHzsGBWDHJ_oP-jTS5-zTxgoxDMAn0sNzUfq1WJf2yhA9z/s1600/squid.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img alt=&quot;squid proxy server&quot; border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2lcSmAzo9M57kErvww14Xo4tFjYb4PckeZjZiMv2dH5_jmRzfDf8ySFOEtCZQgZ2hUSqZXIWraibiZHZpS69DQM_W7S5kwTeHzsGBWDHJ_oP-jTS5-zTxgoxDMAn0sNzUfq1WJf2yhA9z/s200/squid.png&quot; title=&quot;squid&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;Setelah beberapa bulan udah jarang banget ngeblog, tiba-tiba hari ini gw kangen ngeblog. Pada&lt;i&gt; blog post&lt;/i&gt; kali ini gw akan membahas tentang &lt;i&gt;proxy server&lt;/i&gt;. Software &lt;i&gt;proxy server&lt;/i&gt; yg akan kita gunakan adalah Squid Proxy Server (&lt;a href=&quot;https://adf.ly/YUm0x&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Squid 2.7 Stable8&lt;/a&gt;) dan kita akan mencoba instalasi dan konfigurasi pada platform Windows. Sebelum masuk ke pembahasan, apa sih &lt;i&gt;proxy server&lt;/i&gt; itu...&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;Proxy server&lt;/i&gt; adalah sebuah server atau program komputer yang berperan sebagai penghubung antara suatu komputer dengan jaringan internet. Atau dalam kata lain, server proksi adalah suatu jaringan yang menjadi perantara antara jaringan lokal dan jaringan internet.&lt;i&gt; Proxy server&lt;/i&gt; dapat berupa suatu sistem komputer ataupun sebuah aplikasi yang bertugas menjadi gateway atau pintu masuk yang menghubungan komputer kita dengan jaringan luar.&lt;/div&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9rZplDtj-BDIa7fkXhfWckLKD4-Joy-yFv1226G-RHtrcTSOB_Z4WpjA-PK4bM5-s143oGzk6R3uSpD1LNnex_y0dQnPV-qxZ1kSp90BgV9K4qozwA4g48Y8RtJLFSTVdvS9fCg-KqXhf/s1600/proxy-server.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Proxy Server&quot; border=&quot;0&quot; height=&quot;132&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9rZplDtj-BDIa7fkXhfWckLKD4-Joy-yFv1226G-RHtrcTSOB_Z4WpjA-PK4bM5-s143oGzk6R3uSpD1LNnex_y0dQnPV-qxZ1kSp90BgV9K4qozwA4g48Y8RtJLFSTVdvS9fCg-KqXhf/s320/proxy-server.jpg&quot; title=&quot;Proxy Server&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Proxy Server&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Nah, sampai sini udah pada ngerti kan apa itu proxy server. Banyak manfaat yang dapat kita peroleh jika menggunakan proxy server. Berikut manfaat proxy server itu sendiri :&lt;br /&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Mempercepat load page / halaman web yang sering diakses. Squid proxy server dapat melakukan caching web pages atau menyimpan isi dari halaman-halaman yang sering dikunjungi sehingga dapat mempercepat loading halaman web dan juga dapat menghemat bandwidth internet anda.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;Content filtering&lt;/i&gt;. Dengan menggunakan squid proxy server kita juga memfilter content / memblokir situs-situs pornografi atau situs-situs berbahaya berdasarkan domain, IP ataupun &lt;i&gt;keyword &lt;/i&gt;suatu URL.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Squid proxy server juga dapat mengatur kontrol daftar akses / &lt;i&gt;access list&lt;/i&gt;, mengalokasi kan bandwith dan membatasi &lt;i&gt;size&lt;/i&gt; download.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
&lt;span style=&quot;color: red;&quot;&gt;
Instalasi dan Konfigurasi&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;Download terlebih dahulu &lt;a href=&quot;https://adf.ly/YUm0x&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Squid 2.7 Stable8.zip&lt;/a&gt;&amp;nbsp;untuk sistem operasi Windows.&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;Ekstrak folder &lt;b&gt;squid&lt;/b&gt;&amp;nbsp;dari file&amp;nbsp;Squid 2.7 Stable8.zip&amp;nbsp;dan letakkan pada direktori &lt;b&gt;c:\&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;Sebelum menginstall squid, lakukan konfigurasi squid terlebih dahulu. File-file konfigurasi squid terletak pada direktori &lt;b&gt;C:\squid\etc\&lt;/b&gt;. Terdapat 4 file didalam direktori tersebut&lt;/li&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;b&gt;cachemgr.conf.default&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;b&gt;mime.conf.default&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;b&gt;squid.conf.default&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;b&gt;squid_radius_auth.conf.default&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&amp;nbsp;Hapus / Rename semua file dengan ekstensi&amp;nbsp;&lt;b&gt;.default &lt;/b&gt;menjadi&lt;b&gt; .conf&amp;nbsp;&lt;/b&gt;sehingga semua file menjadi :&lt;/li&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;b&gt;cachemgr.conf&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;b&gt;mime.conf&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;b&gt;squid.conf&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&lt;b&gt;squid_radius_auth.conf&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;h3&gt;
&lt;span style=&quot;color: red;&quot;&gt;
Konfigurasi Squid&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
Buka file &lt;b&gt;squid.conf &lt;/b&gt;yang terletak pada direktori &lt;b&gt;C:\squid\etc\ &lt;/b&gt;dengan menggunakan Notepad atau text editor lainnya&lt;b&gt;.&lt;/b&gt;&lt;/div&gt;
&lt;h4&gt;
1. Setting port squid proxy&lt;/h4&gt;
&lt;div&gt;
Gunakan fungsi Search/Find pada text editor anda, cari dengan kata kunci &lt;b&gt;TAG: http_port&lt;/b&gt;. Tentukan no. port yang akan digunakan untuk proxy server, port yang umumnya digunakan adalah port 3128 atau anda juga dapat merubahnya dengan no. port lain.&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&lt;i&gt;Sintaks&lt;/i&gt;:&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;b&gt;http_port [no.port] &lt;/b&gt;atau&amp;nbsp;&lt;b&gt;http_port [hostname:no.port]&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;i&gt;Contoh&lt;/i&gt;:&lt;/span&gt;&lt;/b&gt; &lt;b&gt;http_port 3128 &lt;/b&gt;atau&amp;nbsp;&lt;b&gt;http_port localhost:3128 &lt;/b&gt;atau&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;http_port 127.0.0.1:3128&lt;/b&gt;&lt;/div&gt;
&lt;pre class=&quot;brush: plain; toolbar:&#39;false&#39;; title:&#39;TAG: http_port&#39;&quot;&gt;# TAG: http_port
# Usage: port [options]
#  hostname:port [options]
#  1.2.3.4:port [options]
#
# The socket addresses where Squid will listen for HTTP client
...
# If you run Squid on a dual-homed machine with an internal
# and an external interface we recommend you to specify the
# internal address:port in http_port. This way Squid will only be
# visible on the internal address.
#
# Squid normally listens to port 3128
http_port 3128
&lt;/pre&gt;
&lt;h4&gt;
2. Setting Daftar Akses / &lt;i&gt;Access List &lt;/i&gt;(acl) dan http_access&lt;/h4&gt;
&lt;div&gt;
ACL digunakan untuk membuat suatu rule/aturan yg akan diterapkan. Gunakan fungsi Search/Find pada text editor anda, cari dengan kata kunci &lt;b&gt;TAG: acl&lt;/b&gt;. Karena jaringan di rumah saya menggunakan IP standar 192.168.1.0/24. Maka saya definisikan IP jaringan saya dengan nama_acl my_network (sesuaikan dengan IP jaringan anda).&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&lt;i&gt;Sintaks&lt;/i&gt;:&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;b&gt;acl [nama_acl] [tipe_acl]&amp;nbsp;[argument/file]&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;i&gt;Contoh&lt;/i&gt;:&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;b&gt;acl my_network src 192.168.1.0/24&lt;/b&gt;&lt;/div&gt;
&lt;pre class=&quot;brush: plain; toolbar:&#39;false&#39;; title:&#39;TAG: acl&#39;&quot;&gt;# TAG: acl
#  TAG: acl
# Defining an Access List
#
#    Every access list definition must begin with an aclname and acltype, 
#    followed by either type-specific arguments or a quoted filename that
#    they are read from.
#
...
#Recommended minimum configuration:
acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
#
# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl my_network src 192.168.1.0/24
#&lt;/pre&gt;
&lt;br /&gt;
Setelah mendefinisikan access list, langkah selanjutnya adalah pemberian akses (Allow atau Deny) acl yang telah dibuat sebelumnya. Gunakan kembali fungsi find/search pada text editor anda dan cari &lt;b&gt;TAG: http_access&lt;/b&gt;. Tambahkan sintaks &lt;b&gt;http_access allow localhost&lt;/b&gt; dan &lt;b&gt;http_access allow my_network &lt;/b&gt;tepat dibawah sintaks &lt;b&gt;http_access allow localnet&lt;/b&gt; untuk memberikan ijin akses internet (http) ke localhost (127.0.0.1) dan IP jaringan kita yg telah didefinisikan pada acl.&lt;br /&gt;
&lt;pre class=&quot;brush: plain; toolbar:&#39;false&#39;; title:&#39;TAG: http_access&#39;&quot;&gt;#  TAG: http_access
# Allowing or Denying access based on defined access lists
#
# Access to the HTTP port:
# http_access allow|deny [!]aclname ...
#
...
#Recommended minimum configuration:
#
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports
#
...
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost
http_access allow my_network

# And finally deny all other access to this proxy
http_access deny all
#&lt;/pre&gt;
&lt;h4&gt;
3. Setting DNS (&lt;i&gt;Domain Name Server&lt;/i&gt;)&lt;/h4&gt;
&lt;div&gt;
Untuk konfigurasi DNS sesuaikan dengan DNS ISP anda. Untuk&amp;nbsp;alamat DNS Server yang menggunakan Speedy dapat dilihat &lt;a href=&quot;https://daftar%20dns%20server%20bagi%20pengguna%20speedy/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;disini&lt;/a&gt;. Konfigurasi DNS bisa anda cari pada &lt;b&gt;TAG: dns_nameservers&lt;/b&gt;. Pada tutorial ini saya menggunakan DNS Speedy sebagai DNS primarynya dan OpenDNS untuk DNS secondarynya.&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&lt;i&gt;Sintaks&lt;/i&gt;:&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;b&gt;dns_nameservers [DNS Primary] [DNS Secondary]&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;i&gt;Contoh&lt;/i&gt;:&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;b&gt;dns_nameservers 202.134.2.5 208.67.222.222&lt;/b&gt;&lt;/div&gt;
&lt;pre class=&quot;brush: plain; toolbar:&#39;false&#39;; title:&#39;TAG: dns_nameservers&#39;&quot;&gt;#  TAG: dns_nameservers
# Use this if you want to specify a list of DNS name servers
# (IP addresses) to use instead of those given in your
# /etc/resolv.conf file.
# On Windows platforms, if no value is specified here or in
# the /etc/resolv.conf file, the list of DNS name servers are
# taken from the Windows registry, both static and dynamic DHCP
# configurations are supported.
#
# Example: dns_nameservers 10.0.0.1 192.172.0.4
#
dns_nameservers 202.134.2.5 208.67.222.222
#&lt;/pre&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/4416966175709985471/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2013/11/konfigurasi-dan-instalasi-squid-proxy.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/4416966175709985471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/4416966175709985471'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2013/11/konfigurasi-dan-instalasi-squid-proxy.html' title='Konfigurasi dan Instalasi Squid Proxy Server di Windows'/><author><name>Aditya Nursyahbani</name><uri>http://www.blogger.com/profile/07325213218049741746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTpoUrcVoSJHVanvhqCggtaov04yK6-3r_c3wRwWTa-ADRHKl5ZdFyYM_VXKVHST3BoEN5oUFsAjIXk9x_YbKEcc4eBdbd4JuWjCvPsWiZqs7NDDi9oXLU-mdIWFfTw/s220/SAM_1082.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2lcSmAzo9M57kErvww14Xo4tFjYb4PckeZjZiMv2dH5_jmRzfDf8ySFOEtCZQgZ2hUSqZXIWraibiZHZpS69DQM_W7S5kwTeHzsGBWDHJ_oP-jTS5-zTxgoxDMAn0sNzUfq1WJf2yhA9z/s72-c/squid.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-6375786527391219665</id><published>2013-03-12T20:22:00.002+07:00</published><updated>2019-02-04T22:25:04.242+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CodeIgniter"/><category scheme="http://www.blogger.com/atom/ns#" term="Pemrograman"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>CodeIgniter Login Tutorial</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJJiBnQMLBT0AySKVZ6KxOwMCFRztTpziuToleWVUUUaYmus1zarCNKDlkb4X6p91g_yDkL0x7cTFDWkFR88axNuHH84D1VGudVZOJuJdhgqFVtxO71Svfxae_KtRXDBpXBM2j8-vIyRq4/s640/blogger-image--354390868.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;img alt=&quot;CodeIgniter Login in Mobile View&quot; border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJJiBnQMLBT0AySKVZ6KxOwMCFRztTpziuToleWVUUUaYmus1zarCNKDlkb4X6p91g_yDkL0x7cTFDWkFR88axNuHH84D1VGudVZOJuJdhgqFVtxO71Svfxae_KtRXDBpXBM2j8-vIyRq4/s200/blogger-image--354390868.jpg&quot; title=&quot;CodeIgniter Login - Mobile View&quot; width=&quot;133&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;CodeIgniter Login&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;b&gt;CodeIgniter Login System Tutorial&lt;/b&gt;&amp;nbsp;-&amp;nbsp;Pada kesempatan kali ini saya akan coba membahas tentang bagaimana membuat sistem &lt;i&gt;login&lt;/i&gt; dan &lt;i&gt;register account&lt;/i&gt; dengan menggunakan framework CodeIgniter, MySQL sebagai &lt;i&gt;database servernya&lt;/i&gt;&amp;nbsp;dan Twitter Bootstrap untuk&lt;i&gt; user interface&lt;/i&gt; nya. CodeIgniter merupakan PHP framework yang cukup mudah untuk dipelajari dan juga mendukung konsep MVC (&lt;i&gt;Model View Controller&lt;/i&gt;). Tutorial ini juga membahas sedikit tentang bagaimana mudahnya membuat &lt;i&gt;GUI (front-end)&amp;nbsp;&lt;/i&gt;dengan menggunakan Twitter Bootstrap.&lt;br /&gt;
&lt;br /&gt;
Twitter Bootsrap merupakan sebuah &lt;i&gt;framework &lt;/i&gt;yang cukup populer juga saat ini&amp;nbsp;yang dibangun oleh mantan &lt;i&gt;web designer&lt;/i&gt; Twitter&amp;nbsp;&lt;a href=&quot;https://twitter.com/mdo&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;@mdo&lt;/a&gt;&amp;nbsp;dan&amp;nbsp;&lt;a href=&quot;https://twitter.com/fat&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;@fat&lt;/a&gt;. Fitur dan komponen Twitter Bootstrap cukup lengkap dengan berbagai animasi yg menarik, kita dapat menggunakan jQuery untuk animasi ataupun dengan &lt;i&gt;html markup &lt;/i&gt;yang sudah disediakan. Selain itu, kita tidak perlu lagi membangun web dengan dua versi, versi desktop atau versi mobile, karena Twitter Bootstrap dilengkapi dengan fitur &lt;i&gt;responsive design, &lt;/i&gt;kita hanya perlu memodifikasi css dengan mendefinisikan style CSS berdasarkan lebarnya resolusi layar. Thumbnail diatas adalah &lt;i&gt;screenshoot &lt;/i&gt;aplikasi pada tutorial ini yg dijalankan di iPhone.&lt;br /&gt;
&lt;br /&gt;
Fitur aplikasi yang akan dibangun :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Proses login ke sistem (memanfaatkan&lt;i&gt; CI Session&lt;/i&gt; dan &lt;i&gt;Library&lt;/i&gt; &lt;i&gt;Form Validation&lt;/i&gt;).&lt;/li&gt;
&lt;li&gt;Proses pendaftaran akun (register / create account).&lt;/li&gt;
&lt;li&gt;Lihat data akun detail.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
Berikut merupakan hasil akhir versi &lt;i&gt;desktop&lt;/i&gt;-nya :&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_vIet068kC1R0JuuiuUBb7OU11BR4VS3u0MdeZRukSaPEx8JupAky9haKPDtKjJ8HUg_PCuWYu-lYhxhLNyzT3rJKyMDgIyz6cYdAp7IEacDo4eq8wCBixh-jXmeLXTO69KbZ2bf1hkxw/s1600/ci-login.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;CodeIgniter Login Tutorial&quot; border=&quot;0&quot; height=&quot;267&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_vIet068kC1R0JuuiuUBb7OU11BR4VS3u0MdeZRukSaPEx8JupAky9haKPDtKjJ8HUg_PCuWYu-lYhxhLNyzT3rJKyMDgIyz6cYdAp7IEacDo4eq8wCBixh-jXmeLXTO69KbZ2bf1hkxw/s400/ci-login.jpg&quot; title=&quot;CodeIgniter Login&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;font-size: 13px;&quot;&gt;CodeIgniter Login - Login and Register Form&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;
Persiapan&lt;/h3&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.apachefriends.org/en/xampp-windows.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;XAMPP&lt;/a&gt; (Apache Webserver, PHP and MySQL includes)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ellislab.com/codeigniter/download&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;CodeIgniter 2.1.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.github.com/bootstrap/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Twitter Bootstrap 2.3.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.blogger.com/&quot;&gt;&lt;span id=&quot;goog_1978884000&quot;&gt;&lt;/span&gt;jQuery 1.8.3&lt;span id=&quot;goog_1978884001&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3&gt;
Database&lt;/h3&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Hal yang pertama dilakukan adalah membuat basis data (&lt;i&gt;database&lt;/i&gt;) dengan MySQL, masuk ke phpMyAdmin, input SQL sintax dibawah ini pada menu SQLquery atau sintax pada phpMyAdmin :&lt;/div&gt;
&lt;pre class=&quot;brush: sql; toolbar:&#39;false&#39;; title:&#39;ci-login.sql&#39;&quot;&gt;CREATE DATABASE `ci-login` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `ci-login`;

CREATE TABLE IF NOT EXISTS `account` (
  `first_name` varchar(30) NOT NULL,
  `last_name` varchar(30) NOT NULL,
  `email_address` text NOT NULL,
  `username` varchar(30) NOT NULL,
  `password` text NOT NULL,
  PRIMARY KEY  (`username`)
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

INSERT INTO `account` (`first_name`, `last_name`, `email_address`, `username`, `password`) VALUES
(&#39;Aditya&#39;, &#39;Nursyahbani&#39;, &#39;admin@localhost.com&#39;, &#39;admin&#39;, &#39;21232f297a57a5a743894a0e4a801fc3&#39;);
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Alternatif lain, anda juga dapat melakukan fungsi import phpMyAdmin dari hasil dumping file&lt;b&gt; ci-login.sql&lt;/b&gt; yg terdapat di source code aplikasi ini. Setting konfigurasi CodeIgniter (config.php, autoload.php, database.php, route.php). Setting base_url dan encryption_key untuk dapat menggunakan CodeIgniter Session, untuk lebih jelas bisa di lihat di tutorial sebelumnya &lt;a href=&quot;https://dityalovers.blogspot.com/2012/09/membuat-captcha-dengan-codeigniter.html&quot;&gt;membuat captcha dengan CodeIgniter&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;
Model&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Model merepresentasikan bagaimana operasi / perintah-perintah terhadap suatu basis data yang umumnya terdiri dari CRUD (&lt;i&gt;Create Read Update Delete&lt;/i&gt;) operation. Pada tutorial kali ini kita hanya menggunakan satu model dengan nama account_model.php yang terdiri dari fungsi validasi login, membuat akun baru dan untuk melihat akun detail. Buat file account_model.php (application/models) yang isinya sebagai berikut :&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; title:&#39;account_model.php&#39;&quot;&gt;&amp;lt;?php if ( ! defined(&#39;BASEPATH&#39;)) exit(&#39;No direct script access allowed&#39;);

class Account_model extends CI_Model {
  private $table_name = &#39;account&#39;;
  private $pk = &#39;username&#39;;
  
  public function validasi() {
    $this-&amp;gt;db-&amp;gt;where(&#39;username&#39;, $this-&amp;gt;input-&amp;gt;post(&#39;username&#39;));
    $this-&amp;gt;db-&amp;gt;where(&#39;password&#39;, md5($this-&amp;gt;input-&amp;gt;post(&#39;password&#39;)));
    $query = $this-&amp;gt;db-&amp;gt;get($this-&amp;gt;table_name);
    if($query-&amp;gt;num_rows == 1) {
      return true;
    }
  }
  
  public function buat_akun() {
    $data_baru = array(   
      &#39;first_name&#39;    =&amp;gt; $this-&amp;gt;input-&amp;gt;post(&#39;fname&#39;),
      &#39;last_name&#39;     =&amp;gt; $this-&amp;gt;input-&amp;gt;post(&#39;lname&#39;),
      &#39;email_address&#39; =&amp;gt; $this-&amp;gt;input-&amp;gt;post(&#39;email&#39;),
      &#39;username&#39;      =&amp;gt; $this-&amp;gt;input-&amp;gt;post(&#39;uname&#39;),
      &#39;password&#39;      =&amp;gt; md5($this-&amp;gt;input-&amp;gt;post(&#39;pass&#39;))
    );    
    $simpan_data = $this-&amp;gt;db-&amp;gt;insert($this-&amp;gt;table_name, $data_baru);
    return $simpan_data;
  }
  
  public function lihat_data($username){
    $query = $this-&amp;gt;db-&amp;gt;get_where($this-&amp;gt;table_name, array($this-&amp;gt;pk =&amp;gt; $username));
    return $query-&amp;gt;row_array(); 
  }
}
/* End of file account_model.php */
/* Location: ./application/models/account_model.php */&lt;/pre&gt;
&lt;/div&gt;
&lt;h3&gt;
Controller&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Controller merupakan mediator antara Model dan View dalam konsep MVC dimana semua request/response di handle oleh controller. Misal user melakukan login yg diakses dari form login (View) -&amp;gt; Controller menerima request dan mengeksekusi fungsi cek login, jika data form yang di submit lengkap, Controller memanggil fungsi validasi pada Model dan Model akan mengecek form yang di submit dengan data yang ada pada database kemudian memberikan nilai kembalian berupa TRUE atau FALSE, pada akhirnya Controller memberikan response kepada user (View). Pada tutorial ini kita akan membuat 2 Controller (application/controllers), login dan user Controller. Controller login menghandle fungsi untuk validasi login, membuat akun dan fungsi logout sedangkan Controller user menghandle fungsi untuk melihat detail akun dan pada saat controller ini di inisialisasi akan menjalankan fungsi pengecekan session yang aktif.&lt;/div&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; title:&#39;login.php&#39;&quot;&gt;&amp;lt;?php if ( ! defined(&#39;BASEPATH&#39;)) exit(&#39;No direct script access allowed&#39;);

class Login extends CI_Controller {

  public function __construct(){
    parent::__construct();
    $this-&amp;gt;load-&amp;gt;model(&#39;account_model&#39;);
  }

  public function index(){
    $data[&#39;content&#39;] = &#39;login&#39;;
    $this-&amp;gt;load-&amp;gt;view(&#39;template/index&#39;, $data);
  }
  
  public function cek_login(){
    $user = $this-&amp;gt;input-&amp;gt;post(&#39;username&#39;);
    $pass = $this-&amp;gt;input-&amp;gt;post(&#39;password&#39;);
 
    if(empty($user) or empty($pass)){
      $this-&amp;gt;session-&amp;gt;set_flashdata(&#39;msg&#39;, &#39;Username or password can\&#39;t be blank&#39;);
      redirect(&#39;login&#39;);
    }
 
    $query = $this-&amp;gt;account_model-&amp;gt;validasi();
    if($query){
      $data = array(
        &#39;username&#39; =&amp;gt; $user,
        &#39;is_logged_in&#39; =&amp;gt; true   
      );
 
      $this-&amp;gt;session-&amp;gt;set_userdata($data);
      redirect(&#39;user&#39;);
    }else{
      $this-&amp;gt;session-&amp;gt;set_flashdata(&#39;msg&#39;, &#39;Invalid username and password&#39;);
      redirect(&#39;login&#39;);
    }
  }
  
  public function signup(){
    $this-&amp;gt;load-&amp;gt;library(&#39;form_validation&#39;);
    $this-&amp;gt;form_validation-&amp;gt;set_rules(&#39;fname&#39;, &#39;First Name&#39;, &#39;trim|required&#39;);
    $this-&amp;gt;form_validation-&amp;gt;set_rules(&#39;lname&#39;, &#39;Last Name&#39;, &#39;trim|required&#39;);
    $this-&amp;gt;form_validation-&amp;gt;set_rules(&#39;email&#39;, &#39;Email Address&#39;, &#39;trim|required|valid_email&#39;);
    $this-&amp;gt;form_validation-&amp;gt;set_rules(&#39;uname&#39;, &#39;Username&#39;, &#39;trim|required|min_length[4]&#39;);
    $this-&amp;gt;form_validation-&amp;gt;set_rules(&#39;pass&#39;, &#39;Password&#39;, &#39;trim|required|min_length[6]|max_length[16]&#39;);
    $this-&amp;gt;form_validation-&amp;gt;set_rules(&#39;repass&#39;, &#39;Re-Password&#39;, &#39;trim|required|matches[pass]&#39;);
 
    if($this-&amp;gt;form_validation-&amp;gt;run() == FALSE){
      $data[&#39;content&#39;] = &#39;login&#39;;
      $this-&amp;gt;load-&amp;gt;view(&#39;template/index&#39;, $data);
    }else{
      if($query = $this-&amp;gt;account_model-&amp;gt;buat_akun()){
        $this-&amp;gt;session-&amp;gt;set_flashdata(&#39;success&#39;, &#39;Your account successfully created! you can login now&#39;);
        redirect(&#39;login&#39;);
      }else{
        $this-&amp;gt;session-&amp;gt;set_flashdata(&#39;msg&#39;, &#39;Error insert database&#39;);
        redirect(&#39;login&#39;);
      }
    }
  }
  
  public function logout(){
    $this-&amp;gt;session-&amp;gt;sess_destroy();
    $this-&amp;gt;index();
  }
}
/* End of file login.php */
/* Location: ./application/controllers/login.php */
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Line 5-8 Memanggil / load account_model pada saat inisialisasi controller.&lt;/li&gt;
&lt;li&gt;Line 10-13 Menampilkan form login/register ketika tidak ada request method atau fungsi pada controller.&lt;/li&gt;
&lt;li&gt;Line 15-37 Fungsi untuk validasi login, jika username atau password kosong akan dikembalikan ke form login dengan pesan error, jika lengkap akan dicocokkan dengan data yang ada pada database. Jika hasilnya cocok maka, 2 sesi / session yang akan di daftarkan, sesi dengan nama username yang menampung nama user yang login dan sesi dengan nama is_logged_in yang diisi dengan nilai true dan akan di arahkan ke controller user.&lt;/li&gt;
&lt;li&gt;Line 39-60 Fungsi untuk pendaftaran akun baru yang didalamnya terdapat perintah untuk validasi form input. jika input valid maka data akan di simpan pada database, jika invalid akan muncul pesan error.&lt;/li&gt;
&lt;li&gt;Line 62-65 Fungsi untuk logout akun, sesi user yang aktif akan dihapus / dihancurkan dan redireksi ke halaman login.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; title:&#39;user.php&#39;&quot;&gt;&amp;lt;?php if ( ! defined(&#39;BASEPATH&#39;)) exit(&#39;No direct script access allowed&#39;);

class User extends CI_Controller{
  
  public function __construct(){
    parent::__construct();
    $this-&amp;gt;is_logged_in(); 
  }
  
  public function index(){
    $data[&#39;content&#39;] = &#39;user_area&#39;;
    $this-&amp;gt;load-&amp;gt;view(&#39;template/index&#39;, $data);
  }
  
  public function view_account(){
    $this-&amp;gt;load-&amp;gt;model(&#39;account_model&#39;);
    $data[&#39;account&#39;] = $this-&amp;gt;account_model-&amp;gt;lihat_data($this-&amp;gt;session-&amp;gt;userdata(&#39;username&#39;));
    $data[&#39;content&#39;] = &#39;user_detail&#39;;
    $this-&amp;gt;load-&amp;gt;view(&#39;template/index&#39;, $data);
  }  
  
  public function is_logged_in(){
    $is_logged_in = $this-&amp;gt;session-&amp;gt;userdata(&#39;is_logged_in&#39;);
    if(!isset($is_logged_in) || $is_logged_in != true){
      $this-&amp;gt;session-&amp;gt;set_flashdata(&#39;msg&#39;, &#39;Access denied! You don\&#39;t have permission to access this page or session has expired. Please use login form!&#39;);
      redirect(&#39;login&#39;);
    }
  }
}
/* End of file user.php */
/* Location: ./application/controllers/user.php */
&lt;/pre&gt;
&lt;h3&gt;
View&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
View merupakan&amp;nbsp;antar muka atau tampilan (&lt;i&gt;Graphical User Interface&lt;/i&gt;) yang akan berinteraksi langsung dengan &lt;i&gt;end user&lt;/i&gt;. Tutorial ini akan menggunakan view yang dinamis (di generate dari template) karena halaman yang statis seperti header, footer dan script akan dipanggil berulang-ulang setiap kali halaman di load, sedangkan halaman yang dinamis yang umumnya berubah yaitu halaman content yang isinya berdasarkan hasil request. Berikut merupakan hirarki view (application/views) yang akan dibuat &amp;nbsp;:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;template/ (direktori/folder)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;header.php&lt;/li&gt;
&lt;li&gt;content.php&lt;/li&gt;
&lt;li&gt;footer.php&lt;/li&gt;
&lt;li&gt;script.php&lt;/li&gt;
&lt;li&gt;modal.php&lt;/li&gt;
&lt;li&gt;index.php&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;login.php&lt;/li&gt;
&lt;li&gt;user_area.php&lt;/li&gt;
&lt;li&gt;user_detail.php&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;; title:&#39;header.php&#39;&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;title&amp;gt;CodeIgniter Login Example Using Twitter Bootstrap&amp;lt;/title&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;link href=&quot;&amp;lt;?=base_url();?&amp;gt;css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;link href=&quot;&amp;lt;?=base_url();?&amp;gt;css/bootstrap-responsive.min.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;link href=&quot;&amp;lt;?=base_url();?&amp;gt;css/style.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;&lt;/pre&gt;
Buat file &lt;strong&gt;content.php&lt;/strong&gt; pada direktori application/views/template. Kosongkan isinya karena konten akan di generate dinamis dari controller.&lt;br /&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;; title:&#39;footer.php&#39;&quot;&gt;&amp;lt;footer class=&quot;footer&quot;&amp;gt;
  &amp;lt;p&amp;gt;Copyright © 2013 - &amp;lt;a href=&quot;https://aditya-nursyahbani.com/&quot;&amp;gt;Aditya Nursyahbani&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/footer&amp;gt;
&lt;/pre&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;; title:&#39;script.php&#39;&quot;&gt;    &amp;lt;/div&amp;gt;&amp;lt;!-- /container --&amp;gt;
    &amp;lt;script src=&quot;&amp;lt;?=base_url();?&amp;gt;js/jquery-1.8.3.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;&amp;lt;?=base_url();?&amp;gt;js/bootstrap.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;pre class=&quot;brush: html; toolbar:&#39;false&#39;; title:&#39;modal.php&#39;&quot;&gt;&amp;lt;div id=&quot;help&quot; class=&quot;modal hide fade&quot; tabindex=&quot;-1&quot; role=&quot;dialog&quot; aria-labelledby=&quot;helpLabel&quot; aria-hidden=&quot;true&quot;&amp;gt;
  &amp;lt;div class=&quot;modal-header&quot;&amp;gt;  
    &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;modal&quot; aria-hidden=&quot;true&quot;&amp;gt;×&amp;lt;/button&amp;gt;
 &amp;lt;h3 id=&quot;helpLabel&quot;&amp;gt;Help&amp;lt;/h3&amp;gt;
  &amp;lt;/div&amp;gt;&amp;lt;!-- /modal-header --&amp;gt;
  &amp;lt;div class=&quot;modal-body&quot;&amp;gt;
    &amp;lt;h4&amp;gt;Create Account&amp;lt;/h4&amp;gt;
 &amp;lt;p&amp;gt;Create a new account for accessing the user area. You can fill the registration form and click submit button to proceed. After have an account, you can use your &amp;lt;code&amp;gt;Username&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Password&amp;lt;/code&amp;gt; for login.&amp;lt;/p&amp;gt;&amp;lt;hr/&amp;gt;
 &amp;lt;h4&amp;gt;Login&amp;lt;/h4&amp;gt;
 &amp;lt;p&amp;gt;This is login menu for accessing user area. &amp;lt;code&amp;gt;Username&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Password&amp;lt;/code&amp;gt; are required.&amp;lt;/p&amp;gt;&amp;lt;hr/&amp;gt;
 &amp;lt;h4&amp;gt;Logout&amp;lt;/h4&amp;gt;
 &amp;lt;p&amp;gt;This is logout menu for exit the application (user area) and destroy the active session.&amp;lt;/p&amp;gt;&amp;lt;hr/&amp;gt;
 &amp;lt;h4&amp;gt;View Account Detail&amp;lt;/h4&amp;gt;
 &amp;lt;p&amp;gt;This menu display the current user account information.&amp;lt;/p&amp;gt;&amp;lt;hr/&amp;gt;
 &amp;lt;div class=&quot;media&quot;&amp;gt;
   &amp;lt;a class=&quot;pull-left&quot; href=&quot;#&quot;&amp;gt;&amp;lt;img class=&quot;media-object&quot; src=&quot;&amp;lt;?=base_url(&#39;img/download.png&#39;);?&amp;gt;&quot; width=&quot;64px&quot; height=&quot;64px&quot;&amp;gt;&amp;lt;/a&amp;gt;
   &amp;lt;div class=&quot;media-body&quot;&amp;gt;
     &amp;lt;h4 class=&quot;media-heading&quot;&amp;gt;Download the source code&amp;lt;/h4&amp;gt;The source code for this application available on &amp;lt;a href=&quot;https://github.com/adit-gudhel/ci-login&quot; target=&quot;_blank&quot;&amp;gt;GitHub&amp;lt;/a&amp;gt; repository.
   &amp;lt;/div&amp;gt;
 &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;media&quot;&amp;gt;
      &amp;lt;a class=&quot;pull-left&quot; href=&quot;#&quot;&amp;gt;&amp;lt;img class=&quot;media-object&quot; src=&quot;&amp;lt;?=base_url(&#39;img/message.png&#39;);?&amp;gt;&quot; width=&quot;64px&quot; height=&quot;64px&quot;&amp;gt;&amp;lt;/a&amp;gt;
      &amp;lt;div class=&quot;media-body&quot;&amp;gt;
        &amp;lt;h4 class=&quot;media-heading&quot;&amp;gt;Comments and questions&amp;lt;/h4&amp;gt;Post your questions and comments on the my blog post link below.
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;media&quot;&amp;gt;
      &amp;lt;a class=&quot;pull-left&quot; href=&quot;#&quot;&amp;gt;&amp;lt;img class=&quot;media-object&quot; src=&quot;&amp;lt;?=base_url(&#39;img/blog.png&#39;);?&amp;gt;&quot; width=&quot;64px&quot; height=&quot;64px&quot;&amp;gt;&amp;lt;/a&amp;gt;
      &amp;lt;div class=&quot;media-body&quot;&amp;gt;
        &amp;lt;h4 class=&quot;media-heading&quot;&amp;gt;Tutorial&amp;lt;/h4&amp;gt;See full tutorial on my blog post &amp;lt;a href=&quot;https://dityalovers.blogspot.com/2013/03/codeigniter-login-tutorial.html&quot; target=&quot;_blank&quot;&amp;gt;CodeIgniter Login Tutorial&amp;lt;/a&amp;gt;.
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;media&quot;&amp;gt;
      &amp;lt;a class=&quot;pull-left&quot; href=&quot;#&quot;&amp;gt;&amp;lt;img class=&quot;media-object&quot; src=&quot;&amp;lt;?=base_url(&#39;img/twitter.png&#39;);?&amp;gt;&quot; width=&quot;64px&quot; height=&quot;64px&quot;&amp;gt;&amp;lt;/a&amp;gt;
      &amp;lt;div class=&quot;media-body&quot;&amp;gt;
        &amp;lt;h4 class=&quot;media-heading&quot;&amp;gt;Follow me on Twitter&amp;lt;/h4&amp;gt;&amp;lt;a href=&quot;https://twitter.com/adit_gudhel&quot; target=&quot;_blank&quot;&amp;gt;@adit_gudhel&amp;lt;/a&amp;gt;.
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;&amp;lt;hr/&amp;gt;
  &amp;lt;/div&amp;gt;&amp;lt;!-- /modal-body --&amp;gt;
  &amp;lt;div class=&quot;modal-footer&quot;&amp;gt;
    &amp;lt;button class=&quot;btn&quot; data-dismiss=&quot;modal&quot; aria-hidden=&quot;true&quot;&amp;gt;Close&amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;&amp;lt;!-- /modal-footer --&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- /modal --&amp;gt;
&lt;/pre&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; title:&#39;index.php&#39;&quot;&gt;&amp;lt;?= $this-&amp;gt;load-&amp;gt;view(&#39;template/header&#39;); ?&amp;gt;
&amp;lt;?= $this-&amp;gt;load-&amp;gt;view($content); ?&amp;gt;
&amp;lt;?= $this-&amp;gt;load-&amp;gt;view(&#39;template/footer&#39;); ?&amp;gt;
&amp;lt;?= $this-&amp;gt;load-&amp;gt;view(&#39;template/script&#39;); ?&amp;gt;
&lt;/pre&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; title:&#39;login.php&#39;&quot;&gt;&amp;lt;?php include &#39;template/modal.php&#39;; ?&amp;gt;
&amp;lt;div class=&quot;navbar navbar-inverse navbar-fixed-top&quot;&amp;gt;
  &amp;lt;div class=&quot;navbar-inner&quot;&amp;gt;
    &amp;lt;div class=&quot;container&quot;&amp;gt;
      &amp;lt;!-- .btn-navbar is used as the toggle for collapsed navbar content --&amp;gt;
      &amp;lt;a class=&quot;btn btn-navbar&quot; data-toggle=&quot;collapse&quot; data-target=&quot;.nav-collapse&quot;&amp;gt;
        &amp;lt;span class=&quot;icon-bar&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;icon-bar&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;icon-bar&quot;&amp;gt;&amp;lt;/span&amp;gt;
      &amp;lt;/a&amp;gt;
      &amp;lt;a class=&quot;brand&quot; href=&quot;&amp;lt;?=base_url();?&amp;gt;&quot;&amp;gt;CodeIgniter&amp;lt;/a&amp;gt;
      &amp;lt;div class=&quot;nav-collapse collapse&quot;&amp;gt;
        &amp;lt;ul class=&quot;nav pull-right&quot;&amp;gt;
          &amp;lt;li class=&quot;dropdown&quot;&amp;gt;
            &amp;lt;a href=&quot;#&quot; class=&quot;dropdown-toggle&quot; data-toggle=&quot;dropdown&quot; role=&quot;button&quot;&amp;gt;Account &amp;lt;b class=&quot;caret&quot;&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;ul class=&quot;dropdown-menu dropdown-form&quot;&amp;gt;
              &amp;lt;li&amp;gt;&amp;lt;?php
          echo form_open(&#39;signin&#39;);
       echo form_fieldset();
       echo form_label(&#39;Username&#39;);
       echo form_input(&#39;username&#39;);
       echo form_fieldset_close();
       echo form_fieldset();
       echo form_label(&#39;Password&#39;);
       echo form_password(&#39;password&#39;);
       $data = array(      
         &#39;type&#39;    =&amp;gt; &#39;submit&#39;,
      &#39;class&#39;   =&amp;gt; &#39;btn pull-right&#39;,
      &#39;content&#39; =&amp;gt; &#39;Login&#39;    
       );
       echo form_button($data);
       echo form_fieldset_close();
       echo form_close(); ?&amp;gt;
                &amp;lt;li class=&quot;divider&quot;&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#help&quot; data-toggle=&quot;modal&quot; data-target=&quot;#help&quot;&amp;gt;Help&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
              &amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
          &amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
      &amp;lt;/div&amp;gt;&amp;lt;!--/.nav-collapse --&amp;gt;
    &amp;lt;/div&amp;gt;&amp;lt;!--/container --&amp;gt;
  &amp;lt;/div&amp;gt;&amp;lt;!--/.navbar-inner --&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;!--/.navbar --&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt;&amp;lt;?php
  if($this-&amp;gt;session-&amp;gt;flashdata(&#39;msg&#39;) != &#39;&#39;){
    echo &#39;
    &amp;lt;div class=&quot;row-fluid&quot;&amp;gt;
      &amp;lt;div class=&quot;span12 alert alert-error&quot;&amp;gt;
        &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;alert&quot;&amp;gt;×&amp;lt;/button&amp;gt;&#39;.$this-&amp;gt;session-&amp;gt;flashdata(&#39;msg&#39;).&#39;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;&#39;;
  }  
  if($this-&amp;gt;session-&amp;gt;flashdata(&#39;success&#39;) != &#39;&#39;){
    echo &#39;
    &amp;lt;div class=&quot;row-fluid&quot;&amp;gt;
      &amp;lt;div class=&quot;span12 alert alert-success&quot;&amp;gt;
     &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;alert&quot;&amp;gt;×&amp;lt;/button&amp;gt;&#39;.$this-&amp;gt;session-&amp;gt;flashdata(&#39;success&#39;).&#39;
   &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;&#39;;
  } ?&amp;gt;
  &amp;lt;div class=&quot;row-fluid&quot;&amp;gt;
    &amp;lt;div class=&quot;span6&quot;&amp;gt;
 &amp;lt;?php
   $data = array(&#39;class&#39; =&amp;gt; &#39;form-register&#39;);
   echo form_open(&#39;signup&#39;,$data); ?&amp;gt;
      &amp;lt;h2 class=&quot;form-register-heading&quot;&amp;gt;Create Account&amp;lt;/h2&amp;gt;
    &amp;lt;?php
   $data = array(&#39;name&#39; =&amp;gt; &#39;fname&#39;, &#39;class&#39; =&amp;gt; &#39;input-block-level&#39;, &#39;placeholder&#39; =&amp;gt; &#39;First Name&#39;, &#39;value&#39; =&amp;gt; set_value(&#39;fname&#39;));
   echo form_input($data);
   $data = array(&#39;name&#39; =&amp;gt; &#39;lname&#39;, &#39;class&#39; =&amp;gt; &#39;input-block-level&#39;, &#39;placeholder&#39; =&amp;gt; &#39;Last Name&#39;, &#39;value&#39; =&amp;gt; set_value(&#39;lname&#39;));
   echo form_input($data);
   $data = array(&#39;name&#39; =&amp;gt; &#39;email&#39;, &#39;class&#39; =&amp;gt; &#39;input-block-level&#39;, &#39;placeholder&#39; =&amp;gt; &#39;Email Address&#39;, &#39;value&#39; =&amp;gt; set_value(&#39;email&#39;));
   echo form_input($data);
   $data = array(&#39;name&#39; =&amp;gt; &#39;uname&#39;, &#39;class&#39; =&amp;gt; &#39;input-block-level&#39;, &#39;placeholder&#39; =&amp;gt; &#39;Username&#39;, &#39;value&#39; =&amp;gt; set_value(&#39;uname&#39;));
   echo form_input($data);
   $data = array(&#39;name&#39; =&amp;gt; &#39;pass&#39;, &#39;class&#39; =&amp;gt; &#39;input-block-level&#39;, &#39;placeholder&#39; =&amp;gt; &#39;Password&#39;);
   echo form_password($data);
   $data = array(&#39;name&#39; =&amp;gt; &#39;repass&#39;, &#39;class&#39; =&amp;gt; &#39;input-block-level&#39;, &#39;placeholder&#39; =&amp;gt; &#39;Re-Password&#39;);
   echo form_password($data);
   $data = array(&#39;type&#39; =&amp;gt; &#39;submit&#39;, &#39;class&#39; =&amp;gt; &#39;btn btn-large btn-primary&#39;, &#39;content&#39; =&amp;gt; &#39;Submit&#39;);
   echo form_button($data);
   echo form_close();
 ?&amp;gt;
    &amp;lt;/div&amp;gt;&amp;lt;!--/.span6 --&amp;gt;
    &amp;lt;div class=&quot;span6&quot;&amp;gt;
      &amp;lt;h1&amp;gt;Login Example&amp;lt;/h1&amp;gt;
      &amp;lt;p&amp;gt;Welcome to CodeIgniter Login Example using session&amp;lt;/p&amp;gt;
    &amp;lt;?php   
   if(validation_errors()){
     echo&#39;
  &amp;lt;div class=&quot;row-fluid&quot;&amp;gt;
    &amp;lt;div class=&quot;span12 alert alert-error&quot;&amp;gt;
      &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;alert&quot;&amp;gt;×&amp;lt;/button&amp;gt;&#39;.validation_errors().&#39;
       &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;&#39;;
   }
 ?&amp;gt;
    &amp;lt;/div&amp;gt;&amp;lt;!--/.span6 --&amp;gt;
  &amp;lt;/div&amp;gt; &amp;lt;!--/row --&amp;gt;
&lt;/pre&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; title:&#39;user_area.php&#39;&quot;&gt;&amp;lt;div class=&quot;navbar navbar-inverse navbar-fixed-top&quot;&amp;gt;
  &amp;lt;div class=&quot;navbar-inner&quot;&amp;gt;
    &amp;lt;div class=&quot;container&quot;&amp;gt;
   &amp;lt;!-- .btn-navbar is used as the toggle for collapsed navbar content --&amp;gt;
   &amp;lt;a class=&quot;btn btn-navbar&quot; data-toggle=&quot;collapse&quot; data-target=&quot;.nav-collapse&quot;&amp;gt;
     &amp;lt;span class=&quot;icon-bar&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;icon-bar&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;icon-bar&quot;&amp;gt;&amp;lt;/span&amp;gt;
   &amp;lt;/a&amp;gt;
   &amp;lt;a class=&quot;brand&quot; href=&quot;&amp;lt;?=base_url();?&amp;gt;user&quot;&amp;gt;CodeIgniter&amp;lt;/a&amp;gt;
   &amp;lt;div class=&quot;nav-collapse collapse&quot;&amp;gt;
     &amp;lt;ul class=&quot;nav pull-right&quot;&amp;gt;
    &amp;lt;li class=&quot;dropdown&quot;&amp;gt;
      &amp;lt;a href=&quot;#&quot; class=&quot;dropdown-toggle&quot; data-toggle=&quot;dropdown&quot; role=&quot;button&quot;&amp;gt;
   &amp;lt;?= $this-&amp;gt;session-&amp;gt;userdata(&#39;username&#39;); ?&amp;gt; &amp;lt;b class=&quot;caret&quot;&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;
   &amp;lt;ul class=&quot;dropdown-menu dropdown-form&quot;&amp;gt;
     &amp;lt;li&amp;gt;&amp;lt;a href=&quot;&amp;lt;?=base_url();?&amp;gt;user/detail&quot;&amp;gt;View Account Detail&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
     &amp;lt;li class=&quot;divider&quot;&amp;gt;&amp;lt;/li&amp;gt;
     &amp;lt;li&amp;gt;&amp;lt;a href=&quot;&amp;lt;?=base_url();?&amp;gt;signout&quot;&amp;gt;Logout&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
   &amp;lt;/ul&amp;gt;
    &amp;lt;/li&amp;gt;&amp;lt;!--/.dropdown --&amp;gt;
     &amp;lt;/ul&amp;gt;
   &amp;lt;/div&amp;gt;&amp;lt;!--/.nav-collapse --&amp;gt;
 &amp;lt;/div&amp;gt;&amp;lt;!--/.container --&amp;gt;
  &amp;lt;/div&amp;gt;&amp;lt;!--/.navbar-inner --&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;!--/.navbar --&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt;
  &amp;lt;div class=&quot;row&quot;&amp;gt;
    &amp;lt;div class=&quot;span12&quot;&amp;gt;
   &amp;lt;div class=&quot;hero-unit&quot;&amp;gt;
     &amp;lt;h1&amp;gt;Home&amp;lt;/h1&amp;gt;
  &amp;lt;p&amp;gt;Welcome &amp;lt;strong&amp;gt;&amp;lt;?=$this-&amp;gt;session-&amp;gt;userdata(&#39;username&#39;);?&amp;gt;&amp;lt;/strong&amp;gt;,&amp;lt;br/&amp;gt;This is the main user area.&amp;lt;/p&amp;gt;
   &amp;lt;/div&amp;gt;&amp;lt;!--/.hero-unit --&amp;gt;
 &amp;lt;/div&amp;gt;&amp;lt;!--/.span12 --&amp;gt;
  &amp;lt;/div&amp;gt;&amp;lt;!--/.row --&amp;gt;
&lt;/pre&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; title:&#39;user_detail.php&#39;&quot;&gt;&amp;lt;div class=&quot;navbar navbar-inverse navbar-fixed-top&quot;&amp;gt;
  &amp;lt;div class=&quot;navbar-inner&quot;&amp;gt;
    &amp;lt;div class=&quot;container&quot;&amp;gt;
      &amp;lt;!-- .btn-navbar is used as the toggle for collapsed navbar content --&amp;gt;
      &amp;lt;a class=&quot;btn btn-navbar&quot; data-toggle=&quot;collapse&quot; data-target=&quot;.nav-collapse&quot;&amp;gt;
        &amp;lt;span class=&quot;icon-bar&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;icon-bar&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;icon-bar&quot;&amp;gt;&amp;lt;/span&amp;gt;
      &amp;lt;/a&amp;gt;
      &amp;lt;a class=&quot;brand&quot; href=&quot;&amp;lt;?=base_url();?&amp;gt;user&quot;&amp;gt;CodeIgniter&amp;lt;/a&amp;gt;
      &amp;lt;div class=&quot;nav-collapse collapse&quot;&amp;gt;
        &amp;lt;ul class=&quot;nav pull-right&quot;&amp;gt;
          &amp;lt;li class=&quot;dropdown&quot;&amp;gt;
            &amp;lt;a href=&quot;#&quot; class=&quot;dropdown-toggle&quot; data-toggle=&quot;dropdown&quot; role=&quot;button&quot;&amp;gt;&amp;lt;?= $account[&#39;username&#39;]; ?&amp;gt; &amp;lt;b class=&quot;caret&quot;&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;            &amp;lt;ul class=&quot;dropdown-menu dropdown-form&quot;&amp;gt;
              &amp;lt;li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&quot;&amp;lt;?=base_url();?&amp;gt;user/detail&quot;&amp;gt;View Account Detail&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li class=&quot;divider&quot;&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&quot;&amp;lt;?=base_url();?&amp;gt;signout&quot;&amp;gt;Logout&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
              &amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
          &amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
      &amp;lt;/div&amp;gt;&amp;lt;!--/.nav-collapse --&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;!--/.navbar --&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt;
  &amp;lt;div class=&quot;row-fluid&quot;&amp;gt;
    &amp;lt;div class=&quot;span12&quot;&amp;gt;
      &amp;lt;div class=&quot;hero-unit&quot;&amp;gt;
        &amp;lt;h1&amp;gt;&amp;lt;?= ucfirst($account[&#39;first_name&#39;]); ?&amp;gt; &amp;lt;?= ucfirst($account[&#39;last_name&#39;]); ?&amp;gt;&amp;lt;/h1&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;?= $account[&#39;username&#39;]; ?&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;row-fluid&quot;&amp;gt;
    &amp;lt;div class=&quot;span12&quot;&amp;gt;
      &amp;lt;legend&amp;gt;Your Account Detail :&amp;lt;/legend&amp;gt;
      &amp;lt;div class=&quot;row-fluid&quot;&amp;gt;
        &amp;lt;div class=&quot;span8&quot;&amp;gt;
          &amp;lt;ul class=&quot;nav nav-tabs&quot;&amp;gt;
            &amp;lt;li class=&quot;active&quot;&amp;gt;&amp;lt;a href=&quot;#fname&quot; data-toggle=&quot;tab&quot;&amp;gt;First Name&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#lname&quot; data-toggle=&quot;tab&quot;&amp;gt;Last Name&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#email&quot; data-toggle=&quot;tab&quot;&amp;gt;Email Address&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
          &amp;lt;/ul&amp;gt;
          &amp;lt;div class=&quot;tab-content&quot;&amp;gt;
            &amp;lt;div class=&quot;tab-pane active&quot; id=&quot;fname&quot;&amp;gt;&amp;lt;p&amp;gt;&amp;lt;?= $account[&#39;first_name&#39;]; ?&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;tab-pane&quot; id=&quot;lname&quot;&amp;gt;&amp;lt;p&amp;gt;&amp;lt;?= $account[&#39;last_name&#39;]; ?&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;tab-pane&quot; id=&quot;email&quot;&amp;gt;&amp;lt;p&amp;gt;&amp;lt;?= $account[&#39;email_address&#39;]; ?&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;span4&quot;&amp;gt;&amp;lt;p class=&quot;text-center&quot;&amp;gt;&amp;lt;img class=&quot;img-circle&quot; width=&quot;140&quot; height=&quot;140&quot; src=&quot;&amp;lt;?= base_url(&#39;img/adit.jpg&#39;); ?&amp;gt;&quot;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&lt;/pre&gt;
Finally konfigurasi route.php (application/config) :
&lt;br /&gt;
&lt;pre class=&quot;brush: php; toolbar:&#39;false&#39;; title:&#39;route.php&#39;&quot;&gt;$route[&#39;user/logout&#39;] = &quot;login/logout&quot;;
$route[&#39;user/detail&#39;] = &quot;user/view_account&quot;;
$route[&#39;user&#39;] = &quot;user&quot;;

$route[&#39;signout&#39;] = &quot;login/logout&quot;;

$route[&#39;signin&#39;] = &quot;login/cek_login&quot;;
$route[&#39;signup&#39;] = &quot;login/signup&quot;;
$route[&#39;:any&#39;] = &quot;login&quot;;

$route[&#39;default_controller&#39;] = &quot;login&quot;;
$route[&#39;404_override&#39;] = &#39;&#39;;
&lt;/pre&gt;
&lt;div&gt;
&lt;h3&gt;
Screenshoot aplikasi&lt;/h3&gt;
&lt;div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPJKOwHHVr_5k040AgfaXzLBR6LSYLy-KwNujlsojZYaglKsRL44_6ZtjrhkXMCBgvzWEVOs2etNKUiKv5wOgE3KlrKI4V31Ojis7d24q_1BM6nFJUg5LbCc0pBgfJQEkTy5cvuhZyKXf6/s1600/ci-login-form-validation.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;CodeIgniter Login - Form Validation Error&quot; border=&quot;0&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPJKOwHHVr_5k040AgfaXzLBR6LSYLy-KwNujlsojZYaglKsRL44_6ZtjrhkXMCBgvzWEVOs2etNKUiKv5wOgE3KlrKI4V31Ojis7d24q_1BM6nFJUg5LbCc0pBgfJQEkTy5cvuhZyKXf6/s320/ci-login-form-validation.jpg&quot; title=&quot;CodeIgniter Login - Form Validation Error&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;font-size: 13px;&quot;&gt;CodeIgniter Login - Form Validation Error&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisitVp4x6dCffRYIUtwHFK6adPMee030954gc9oRUrcBttz-q-sJv70oFbNXBAKcxIi9Vg_tytoGbiZy3dCGMUEiJh1wrcRvCRX2vLmdvzdqHhrTVLfxFAea6NLoUJiYLX-H_ySLTr41nf/s1600/ci-login-account-created.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;CodeIgniter Login - Account Created&quot; border=&quot;0&quot; height=&quot;231&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisitVp4x6dCffRYIUtwHFK6adPMee030954gc9oRUrcBttz-q-sJv70oFbNXBAKcxIi9Vg_tytoGbiZy3dCGMUEiJh1wrcRvCRX2vLmdvzdqHhrTVLfxFAea6NLoUJiYLX-H_ySLTr41nf/s320/ci-login-account-created.jpg&quot; title=&quot;CodeIgniter Login - Account Created&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;font-size: 13px;&quot;&gt;CodeIgniter Login - Account Created&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;h3&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCC2_ZAzeAUxbytckmMnJ8DaPFF-muy3-vZpriTVNljKtewdtrBJIxc5Vbh-dg5IAJIjFXlqs8q-jECUW2mHFtmwDACx8mUWSSz3GFxeLOdVlHUJ8RFlosPTV5Z6D9u31sx7l0C1DNZm5P/s1600/ci-login-error-login.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;CodeIgniter Login - Error when Username and Password empty&quot; border=&quot;0&quot; height=&quot;231&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCC2_ZAzeAUxbytckmMnJ8DaPFF-muy3-vZpriTVNljKtewdtrBJIxc5Vbh-dg5IAJIjFXlqs8q-jECUW2mHFtmwDACx8mUWSSz3GFxeLOdVlHUJ8RFlosPTV5Z6D9u31sx7l0C1DNZm5P/s320/ci-login-error-login.jpg&quot; title=&quot;CodeIgniter Login - Error&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;font-size: 13px;&quot;&gt;CodeIgniter Login - Error&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/h3&gt;
&lt;h3&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_Wc7ECXW-gi9mxqQrqRZ2Q3WdeLpfsZDp78W98uhFSih5Ct9F0gMHHjRNadCsE_NozUqA46u22XPd1s3IipZRfruQcq0r38CgpjxLhjplkPycE7Kjn14OTLBlM3nF1SzoIABGfIOteyAn/s1600/ci-login-invalid-login.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;CodeIgniter Login - Invalid Username and Password&quot; border=&quot;0&quot; height=&quot;231&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_Wc7ECXW-gi9mxqQrqRZ2Q3WdeLpfsZDp78W98uhFSih5Ct9F0gMHHjRNadCsE_NozUqA46u22XPd1s3IipZRfruQcq0r38CgpjxLhjplkPycE7Kjn14OTLBlM3nF1SzoIABGfIOteyAn/s320/ci-login-invalid-login.jpg&quot; title=&quot;CodeIgniter Login - Invalid Username and Password&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;font-size: 13px;&quot;&gt;CodeIgniter Login - Invalid Username and Password&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/h3&gt;
&lt;h3&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAW2xefwh7R6owXHSg7q7g33QLA9aiBOGQAArAumSy-HZ3cB1SK9RReLdZnoSQu9zI-sWUfLI3MOULKIQcmkYUzAGuoVYu9gvY3y-63F8wFBg9Y4o0JhLeikR0fR44BiXswuKJDINesDr3/s1600/ci-login-account-details.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;CodeIgniter Login - View Account Detail&quot; border=&quot;0&quot; height=&quot;226&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAW2xefwh7R6owXHSg7q7g33QLA9aiBOGQAArAumSy-HZ3cB1SK9RReLdZnoSQu9zI-sWUfLI3MOULKIQcmkYUzAGuoVYu9gvY3y-63F8wFBg9Y4o0JhLeikR0fR44BiXswuKJDINesDr3/s320/ci-login-account-details.jpg&quot; title=&quot;CodeIgniter Login - View Account Detail&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;font-size: 13px;&quot;&gt;CodeIgniter Login - View Account Detail&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/h3&gt;
&lt;h3&gt;
Download the source code&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Source code&amp;nbsp;&lt;a href=&quot;https://adf.ly/KfMu9&quot; rel=&quot;nofollow&quot;&gt;ci-login.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fork me on GitHub &lt;a href=&quot;https://adf.ly/KezIt&quot; rel=&quot;nofollow&quot;&gt;repository&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/6375786527391219665/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2013/03/codeigniter-login-tutorial.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/6375786527391219665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/6375786527391219665'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2013/03/codeigniter-login-tutorial.html' title='CodeIgniter Login Tutorial'/><author><name>Aditya Nursyahbani</name><uri>http://www.blogger.com/profile/07325213218049741746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTpoUrcVoSJHVanvhqCggtaov04yK6-3r_c3wRwWTa-ADRHKl5ZdFyYM_VXKVHST3BoEN5oUFsAjIXk9x_YbKEcc4eBdbd4JuWjCvPsWiZqs7NDDi9oXLU-mdIWFfTw/s220/SAM_1082.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJJiBnQMLBT0AySKVZ6KxOwMCFRztTpziuToleWVUUUaYmus1zarCNKDlkb4X6p91g_yDkL0x7cTFDWkFR88axNuHH84D1VGudVZOJuJdhgqFVtxO71Svfxae_KtRXDBpXBM2j8-vIyRq4/s72-c/blogger-image--354390868.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-1380387729887909466</id><published>2013-02-27T03:17:00.003+07:00</published><updated>2019-02-04T21:37:26.879+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>Cara RMA Hard Disk Seagate</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Berikut ini merupakan tutorial langkah demi langkah (&lt;i&gt;step-by-step&lt;/i&gt;) untuk melakukan &lt;a href=&quot;https://dityalovers.blogspot.com/2013/02/cara-rma-hard-disk-seagate.html&quot;&gt;RMA (Return Material Authorization) Hard Disk Seagate&lt;/a&gt;, maksudnya RMA adalah mengembalikan Hardisk yang rusak Merk Seagate ke Pihak Seagate untuk diperbaiki dan diganti dengan hard disk pengganti, dengan syarat hard disk yg rusak masih dalam masa &lt;u&gt;garansi&lt;/u&gt;.&lt;br /&gt;
&lt;br /&gt;
Minggu yang lalu, pas gw nyalain komputer di BIOS POST message muncul tulisan &quot;&lt;i&gt;S.M.A.R.T Harddisk Check Failure, Press F1 to Continue&lt;/i&gt;&quot;. Awalnya gw pikir cuma error biasa / cuma scan disk, tapi ternyata setiap booting komputer selalu muncul message tersebut. Ternyata pas gw scan harddisk pake fitur CHKDSK-nya windows, harddisk Seagate 1 Tb gw ada&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;BAD SECTOR&lt;/span&gt;-nya. Sempet gw panik, bukan karena data penting / data kuliah / data skripsi gw, tapi koleksi film gw yg udah merenggut 50% dari kapasitas harddisk gw :). Akhirnya gw googling dan ternyata Seagate menyediakan fasilitas RMA, harddisk gw kembali normal lagi dalam 1 minggu.&amp;nbsp;&lt;/div&gt;
&lt;h4&gt;
&lt;b&gt;How-To :&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Catat &lt;b&gt;Serial Number (S/N)&lt;/b&gt; dan &lt;b&gt;Model Number&lt;/b&gt; Harddisk yang ingin dikembalikan. Ada dua cara untuk mengecek S/N dan Model Number harddisk Seagate :&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;Pertama, bisa dilihat langsung pada fisik harddisk.&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2qN6mHfT4ysloAi0wXvzkq3aU_Ol-wQuTF45pdDokI_vv8gOW5IwUDlHXTFtbpI_CNjAJ_DlME0ZhGkxBSAyBM2REv3-7ZbtnctltyxnV1x8WOvFu773hS6hMc-EDnGm8fynQRCWE52B8/s1600/Serial-and-Model-Number-hdd-Seagate.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Serial Number dan Model Number Harddisk Seagate&quot; border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2qN6mHfT4ysloAi0wXvzkq3aU_Ol-wQuTF45pdDokI_vv8gOW5IwUDlHXTFtbpI_CNjAJ_DlME0ZhGkxBSAyBM2REv3-7ZbtnctltyxnV1x8WOvFu773hS6hMc-EDnGm8fynQRCWE52B8/s400/Serial-and-Model-Number-hdd-Seagate.JPG&quot; title=&quot;S/N dan Model Number Harddisk Seagate&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;S/N dan Model Number Harddisk Seagate&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;Kedua, dengan menggunakan software &lt;/span&gt;&lt;a href=&quot;https://adf.ly/Js0vK&quot; onclick=&quot;javascript:_gag.push([&#39;_trackEvent&#39;,&#39;outbound-link&#39;,&#39;https://adf.ly/Js0vK&#39;]);&quot; rel=&quot;nofollow&quot; style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;SeaTools for Windows&lt;/b&gt;&lt;/a&gt;&lt;span style=&quot;text-align: justify;&quot;&gt; (Download dan install, scan hardisk menggunakan software ini, harddisk dalam kondisi terpasang di komputer / laptop).&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDIVDOj2-x0FTN3ziXvhEGj2BwZ2ZXud06lSFP073xFEFHQG0RU_4ckzUYNH8Szpj_EdbsjbIWBDfTXb_IFqzvbvkXz7Kr8Vk54CDcCE4aCfmAx2VUjwJD4YGN99ERUlB2mZI9TaYNeZjp/s1600/SeaToolsWindows.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;img alt=&quot;SeaTools&quot; border=&quot;0&quot; height=&quot;262&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDIVDOj2-x0FTN3ziXvhEGj2BwZ2ZXud06lSFP073xFEFHQG0RU_4ckzUYNH8Szpj_EdbsjbIWBDfTXb_IFqzvbvkXz7Kr8Vk54CDcCE4aCfmAx2VUjwJD4YGN99ERUlB2mZI9TaYNeZjp/s400/SeaToolsWindows.jpg&quot; title=&quot;SeaTools for Windows&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Short Generic Test using SeaTools for Windows&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Cek status garansi harddisk yang rusak di &lt;a href=&quot;https://support.seagate.com/customer/en-US/warranty_validation.jsp?form=0&quot; onclick=&quot;javascript:_gag.push([&#39;_trackEvent&#39;,&#39;outbound-link&#39;,&#39;https://support.seagate.com/customer/en-US/warranty_validation.jsp?form=0&#39;]);&quot; rel=&quot;nofollow&quot;&gt;https://support.seagate.com/customer/en-US/warranty_validation.jsp?form=0&lt;/a&gt;. Input Serial Number dan Model Number yang sudah dicatat sebelumnya, input kode captcha dan klik &lt;b&gt;Submit&lt;/b&gt;.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Jika harddisk masih dalam masa garansi (&quot;In Warranty&quot;), Klik Create Return untuk membuat RMA Order. Ceklist &lt;b&gt;Return&lt;/b&gt; dan klik &lt;b&gt;Continue&lt;/b&gt;.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Input data-data Anda yang sudah disediakan pada form input Shipping Addres (masukan data dengan lengkap untuk memudahkan proses pengiriman kembali harddisk pengganti, cantumkan juga alamat email anda untuk memudahkan jika ada progress status Order RMA dikirimkan via email), ceklist I Accept Terms and Conditions, klik &lt;b&gt;Review Order/Payment&lt;/b&gt; untuk melihat kembali data Order yang telah diinput.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Pilih lokasi pengiriman harddisk yang rusak (&lt;b&gt;Return Location&lt;/b&gt;), ada 2 lokasi : PT UPS SCS Indonesia yang terletak di Bandara Soekarno Hatta dan langsung ke Seagate Singapore. Pilih yang terdekat sesuai dengan domisili anda. &lt;i&gt;less shipping cost&lt;/i&gt; :)&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Pada form berikutnya, Catat &lt;b&gt;Order Number&lt;/b&gt; anda. Order Number digunakan untuk mengecek status dan progress Order anda. Klik &lt;b&gt;Print Mailing Label&lt;/b&gt; untuk mencetak alamat return location dan order number anda yang nantinya ditempelkan di paket anda pada saat melakukan pengiriman harddisk yang rusak.&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8vTzt4AeNfS7ra0vVk9oWjNQoyR7oKa0IqqBzQZXBhcPRgAcgRRNVtMOj0yrbINyLz_9ps4q7f_EiaLuwwXZcAa9duyFtscznYZT1DWoGF8gndcqEhhduWNjj5UNz7mErlzt9UppnCoN1/s1600/mailing-label.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Print Mailing Label&quot; border=&quot;0&quot; height=&quot;256&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8vTzt4AeNfS7ra0vVk9oWjNQoyR7oKa0IqqBzQZXBhcPRgAcgRRNVtMOj0yrbINyLz_9ps4q7f_EiaLuwwXZcAa9duyFtscznYZT1DWoGF8gndcqEhhduWNjj5UNz7mErlzt9UppnCoN1/s320/mailing-label.jpg&quot; title=&quot;Print Mailing Label&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Mailing Label (ditempel pada paket yg akan dikirim)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Sebelum melakukan pengiriman harddisk yang rusak ke alamat return location, baca terlebih dahulu &lt;a href=&quot;https://docs.google.com/file/d/0B7Yl298joWfvcGZkUE9fZkxDUjA/edit?usp=sharing&quot; rel=&quot;nofollow&quot;&gt;petunjuk packing seagate.pdf&lt;/a&gt; agar harddisk yang dikirim tidak ditolak oleh Seagate. Backup juga data pada harddisk jika masih memungkinkan, anda juga dapat &lt;i&gt;reques&lt;/i&gt;t jasa backup data dari Seagate (dengan biaya tambahan). Kirim Paket harddisk yang rusak ke alamat Return Location bisa menggunakan jasa JNE/Tiki.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Cek status Order RMA anda secara berkala di &lt;a href=&quot;https://store.seagate.com/webapp/wcs/stores/servlet/SgOrderSearch?langId=-1&amp;amp;storeId=11001&amp;amp;krypto=lZV0ifY90uy6PUbeNYxmlPH3KBzCj3e1Q9CotvAOXLxUMfkQzwW3tlpDZPI7rWsJ&amp;amp;ddkey=https:SgSSORedirect&quot; onclick=&quot;javascript:_gag.push([&#39;_trackEvent&#39;,&#39;outbound-link&#39;,&#39;https://store.seagate.com/webapp/wcs/stores/servlet/SgOrderSearch?langId=-1&amp;amp;storeId=11001&amp;amp;krypto=lZV0ifY90uy6PUbeNYxmlPH3KBzCj3e1Q9CotvAOXLxUMfkQzwW3tlpDZPI7rWsJ&amp;amp;ddkey=https:SgSSORedirect&#39;]);&quot; rel=&quot;nofollow&quot;&gt;https://store.seagate.com&lt;/a&gt;. Input &lt;b&gt;Order Number&lt;/b&gt; dan &lt;b&gt;Nama Belakang&lt;/b&gt; anda, klik &lt;b&gt;Find your Order&lt;/b&gt;.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2rZqiCVo2tjAdToATc6zad033rYjiMk7snMOmFy_tFSGznycskHjfqMb4WLeddSkl4dM4-9Ga6yw2P3JGGHCNQ4-AnNmOlreONdavl56BeQbRFrQngjsWBFU6XNVtGXjgLAHorlbNUe19/s1600/check-rma.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Return and Order Status&quot; border=&quot;0&quot; height=&quot;131&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2rZqiCVo2tjAdToATc6zad033rYjiMk7snMOmFy_tFSGznycskHjfqMb4WLeddSkl4dM4-9Ga6yw2P3JGGHCNQ4-AnNmOlreONdavl56BeQbRFrQngjsWBFU6XNVtGXjgLAHorlbNUe19/s400/check-rma.jpg&quot; title=&quot;Return and Order Status&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Jika Order Status masih Open dan Received by Seagate No, berarti harddisk yang rusak belum diterima oleh Seagate. Order Status akan menjadi Closed jika harddisk sudah diterima dan dikirimkan kembali.&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeL7U_y94ancPqtDxKnfC0MUeGpZcHBjy9NUWJxw20-KZmKd04EzcKzvwrLBBTyLMvld02Dyc750OhpT8ih0zpsXSvBLcq36ytSoHfugF7dXvzRpbJd80QqiBW7hPKpymy1e3bDs_QeFFz/s1600/rma-order-detail.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;RMA Order Detail&quot; border=&quot;0&quot; height=&quot;294&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeL7U_y94ancPqtDxKnfC0MUeGpZcHBjy9NUWJxw20-KZmKd04EzcKzvwrLBBTyLMvld02Dyc750OhpT8ih0zpsXSvBLcq36ytSoHfugF7dXvzRpbJd80QqiBW7hPKpymy1e3bDs_QeFFz/s320/rma-order-detail.jpg&quot; title=&quot;RMA Seagate Order Detail&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Cek RMA Order Detail&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Seagate akan mengirimkan UPS &lt;b&gt;Tracking Number &lt;/b&gt;ke email atau&amp;nbsp;jika harddisk pengganti telah dikirim. Atau juga bisa dicek pada menu &lt;b&gt;Shipment Details&lt;/b&gt; pada &amp;nbsp;RMA Order Detail.&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDS3D-kYGnTNg0wSzq2DjNJkRbWTZz1zx4l69y1zOssZ7T_CzBsV_BSkqTY6pXp2zso9bZOfZPIN65fmXwnfRtjZIKe5nNsws_BBrKLIVzmXOaY0g92HfCWi8kkChA5l_1Nonqa7JVFAmE/s1600/Shipment-Details.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;RMA Shipment Details&quot; border=&quot;0&quot; height=&quot;119&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDS3D-kYGnTNg0wSzq2DjNJkRbWTZz1zx4l69y1zOssZ7T_CzBsV_BSkqTY6pXp2zso9bZOfZPIN65fmXwnfRtjZIKe5nNsws_BBrKLIVzmXOaY0g92HfCWi8kkChA5l_1Nonqa7JVFAmE/s320/Shipment-Details.jpg&quot; title=&quot;RMA Seagate Shipment Details&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Cek Tracking Number pada Shipment Detail&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Untuk tracking UPS dapat dicek di situs &lt;a href=&quot;https://www.ups.com/tracking/tracking.html&quot; onclick=&quot;javascript:_gag.push([&#39;_trackEvent&#39;,&#39;outbound-link&#39;,&#39;https://www.ups.com/tracking/tracking.html&#39;]);&quot; rel=&quot;nofollow&quot;&gt;https://www.ups.com/tracking/tracking.html&lt;/a&gt; dengan cara input data &lt;b&gt;Tracking Number&lt;/b&gt; yang telah diterima.&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXu9TdH3gGMEEsiXwHW4uMRIq-hqw2VYISGJBdOLqqLCheaaQU8poj9a9sywez8E_3BQBw7gCKHYLxF8ZtyTcEOOV-SzU5HCAfvsxTsM0Cb49ZARZ6e0PC6X33wgYlidAb_TnGdSWJNW2u/s1600/ups-shipped.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;UPS Track Shipment&quot; border=&quot;0&quot; height=&quot;222&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXu9TdH3gGMEEsiXwHW4uMRIq-hqw2VYISGJBdOLqqLCheaaQU8poj9a9sywez8E_3BQBw7gCKHYLxF8ZtyTcEOOV-SzU5HCAfvsxTsM0Cb49ZARZ6e0PC6X33wgYlidAb_TnGdSWJNW2u/s320/ups-shipped.jpg&quot; title=&quot;UPS Tracking&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Tracking Shipment on UPS Tracking Website&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;
&lt;b&gt;Berikut kronologis kejadiannya (Proses RMA 1 Minggu) :&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;Senin (18/02/2013)&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
- Gw cek garansi harddisk dan ternyata masih valid sampai Juli 2013, akhirnya gw daftarin harddisk / Order RMA di situs Seagate.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Selasa (19/02/2013)&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;- &lt;/b&gt;Gw paketin hardisk gw yg rusak dan gw kirim ke alamat Seagate&lt;b style=&quot;font-style: italic;&quot;&gt;&amp;nbsp;&lt;/b&gt;&lt;i style=&quot;font-weight: bold;&quot;&gt;return location &lt;/i&gt;yang di Bandara Soeta, PT UPS SCS Indo.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Jumat (22/02/2013)&lt;/b&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
- Gw terima email (Seagate RMS Receipt Acknowledment RMA) dari seagate yang isinya harddisk yang gw paketin udah nyampe di Seagate Singapore (Received by Seagate) dan&amp;nbsp;Total Return Unrepaired Quantity (RUR) gw 0, klo RUR-nya lebih dari ( &amp;gt;) 0 maka RMA kita ditolak (rejected).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
- Gw terima email lg dari Seagate klo harddisk pengganti udah dikirim melalui jasa UPS dan juga gw dapet Tracking Number UPS. Gw coba track ke UPS ternyata Tracking Numbernya&lt;i&gt; &lt;span style=&quot;color: red;&quot;&gt;Invalid&lt;/span&gt;&lt;/i&gt;.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Senin (25/02/2013)&lt;/b&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;- &lt;/b&gt;Akhirnya gw track lg di UPS ternyata order gw baru diproses hari ini dan harddisk masih di UPS Singapore.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Selasa (26/02/2013)&lt;/b&gt;&lt;br /&gt;
- Finally, Harddisk Seagate 1 Tb akhirnya sampe di rumah gw :)&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmXNKPivzpi4Tn6h73JXdUhwoiBDNrIRNcPPbZSRzNxLGS8eVfrCNDLxiWdAPw8qEeWqTcREAB_iPE1meqcd-9zzRjNr1CcoW04sdn5Ra2FGH7RQS6U956wiNeI8ILrJpnQQSKIMTpDrpr/s1600/IMG_0854.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;New RMA harddisk from Seagate&quot; border=&quot;0&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmXNKPivzpi4Tn6h73JXdUhwoiBDNrIRNcPPbZSRzNxLGS8eVfrCNDLxiWdAPw8qEeWqTcREAB_iPE1meqcd-9zzRjNr1CcoW04sdn5Ra2FGH7RQS6U956wiNeI8ILrJpnQQSKIMTpDrpr/s200/IMG_0854.JPG&quot; title=&quot;New RMA harddisk from Seagate&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfNC_itylMsgYq8e0qgZE6NM7g3wwq4HxE246RRq_DEEOeO7BEVOH0it0Ge_6NvHb8KBryh1papND64DLnBWmjtTBJ11ug7oCicRvG6Hm2tm4t4e7AhX16Um0ypQAVS6UPoqy9R9DEDSs6/s1600/IMG_0851.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Ship Paper RMA Seagate&quot; border=&quot;0&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfNC_itylMsgYq8e0qgZE6NM7g3wwq4HxE246RRq_DEEOeO7BEVOH0it0Ge_6NvHb8KBryh1papND64DLnBWmjtTBJ11ug7oCicRvG6Hm2tm4t4e7AhX16Um0ypQAVS6UPoqy9R9DEDSs6/s200/IMG_0851.JPG&quot; title=&quot;Ship Paper RMA Seagate&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/1380387729887909466/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2013/02/cara-rma-hard-disk-seagate.html#comment-form' title='1 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1380387729887909466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/1380387729887909466'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2013/02/cara-rma-hard-disk-seagate.html' title='Cara RMA Hard Disk Seagate'/><author><name>Aditya Nursyahbani</name><uri>http://www.blogger.com/profile/07325213218049741746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTpoUrcVoSJHVanvhqCggtaov04yK6-3r_c3wRwWTa-ADRHKl5ZdFyYM_VXKVHST3BoEN5oUFsAjIXk9x_YbKEcc4eBdbd4JuWjCvPsWiZqs7NDDi9oXLU-mdIWFfTw/s220/SAM_1082.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2qN6mHfT4ysloAi0wXvzkq3aU_Ol-wQuTF45pdDokI_vv8gOW5IwUDlHXTFtbpI_CNjAJ_DlME0ZhGkxBSAyBM2REv3-7ZbtnctltyxnV1x8WOvFu773hS6hMc-EDnGm8fynQRCWE52B8/s72-c/Serial-and-Model-Number-hdd-Seagate.JPG" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-3200309562456447935</id><published>2013-02-11T01:00:00.000+07:00</published><updated>2019-02-04T21:10:36.676+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><title type='text'>Metroon Windows 8 Dreamboard Theme</title><content type='html'>&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDA7jOpR1wA7-XMBVmVddjKjEE9k_BPzSOmpq-nq5WSmjApn92L5AxzYTEuUgqouCwWgZs6bvGV3o0maf29G70eXoNcpi3ei9or8H5QrnzvMlaGysVzVKulpJUEbYMn1hg32EiOZa2Rcdk/s1600/metroon.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;iPhone Metroo Dreamboard Theme&quot; border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDA7jOpR1wA7-XMBVmVddjKjEE9k_BPzSOmpq-nq5WSmjApn92L5AxzYTEuUgqouCwWgZs6bvGV3o0maf29G70eXoNcpi3ei9or8H5QrnzvMlaGysVzVKulpJUEbYMn1hg32EiOZa2Rcdk/s200/metroon.PNG&quot; title=&quot;Metroon Dreamboard&quot; width=&quot;131&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;u&gt;Metroon Dreamboard Theme&lt;/u&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;Metroon&lt;/b&gt; - Windows 8 Metro UI a-like &lt;a href=&quot;https://dityalovers.blogspot.com/2012/07/dreamboard.html&quot;&gt;Dreamboard&lt;/a&gt; Themes for iPhone. If you wanna make your iPhone looks like Windows 8 GUI (Metro Style UI), you can try this stunning &lt;span style=&quot;color: #0000ee;&quot;&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;theme that consists of many features like :&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Pin / Unpin System&lt;/b&gt;&lt;br /&gt;
A dynamic pin and unpin system. You can pin any app you like to the home
 screen. Tiles are auto created but can be customized in many different 
ways.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYpTnh0G2ykKmSDrLU1UFXk3TFiQbP_nwrNQhY5vFEucgme_Gr_ccLB7wRYPMvyZvZvFFqi70tmIS4cCr_dopd4NVOy7eZO6LuFYHELRVCQkZ6JHlAD34G_WIqMqjlLrZOfZMoqXtNhFMu/s1600/metroon_pin_to_start.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Pin / Unpin to Start Menu&quot; border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYpTnh0G2ykKmSDrLU1UFXk3TFiQbP_nwrNQhY5vFEucgme_Gr_ccLB7wRYPMvyZvZvFFqi70tmIS4cCr_dopd4NVOy7eZO6LuFYHELRVCQkZ6JHlAD34G_WIqMqjlLrZOfZMoqXtNhFMu/s320/metroon_pin_to_start.jpg&quot; title=&quot;Pin / Unpin to Start Menu&quot; width=&quot;172&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;u&gt;Pin / Unpin to Start Menu&lt;/u&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;b&gt;HTML &#39;Live&#39; Tiles&lt;/b&gt;&lt;br /&gt;
You can use any html widget as a &#39;live&#39; tile. All live tiles that were compatible with OS7/OS7:Revive will work on with theme.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Desktop Tile&lt;/b&gt;&lt;br /&gt;
A tile that uses your current wallpaper and allows you to switch to your regular iOS interface without loading times. A press on the home button brings you back to the Metroon interface.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4Dh6v1vqYEBeUSyTa1U2A06Dz8hN-kuO5jvI2CXzR2YtZS-H0qw3Yev9fWc4IydJ2D_zQT8asJXnUnB4CkinbzB-t4pcj6tLsxhzCHrhN83jzoObkwV5lQi3svqDxukNYMgiba5WWyEpG/s1600/metroon_desktop.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Metroon Desktop View&quot; border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4Dh6v1vqYEBeUSyTa1U2A06Dz8hN-kuO5jvI2CXzR2YtZS-H0qw3Yev9fWc4IydJ2D_zQT8asJXnUnB4CkinbzB-t4pcj6tLsxhzCHrhN83jzoObkwV5lQi3svqDxukNYMgiba5WWyEpG/s320/metroon_desktop.jpg&quot; title=&quot;Metroon Desktop View&quot; width=&quot;174&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;u&gt;Metroon Desktop View&lt;/u&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Easy Way To Change The Tile Size&lt;/b&gt;&lt;br /&gt;
The tile can be made smaller or larger with the press of a single button.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxjbom6zCeB8jweX_uAB4cQVltK6bYf47OxnPHClj5mW3d1AiRbcPK1YwpVSTE47mRHINPCt5RwgKqoXx3KcJvQhDE6jl281XYaBgBesTmNAh72Tpt5NsQ4eypYWe4lianhj-twJdrJB_n/s1600/metroon_live_tile.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;metroon pin / unpin to start&quot; border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxjbom6zCeB8jweX_uAB4cQVltK6bYf47OxnPHClj5mW3d1AiRbcPK1YwpVSTE47mRHINPCt5RwgKqoXx3KcJvQhDE6jl281XYaBgBesTmNAh72Tpt5NsQ4eypYWe4lianhj-twJdrJB_n/s320/metroon_live_tile.jpg&quot; title=&quot;metroon pin / unpin to start&quot; width=&quot;174&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Lockscreen&lt;/b&gt;&lt;br /&gt;
A windows style lockscreen with custom media controls that shows your latest appointment you have set in your local calendar app.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsGGbyTtA94Wjiecv10tTM_Lw4-zKSmNOe9L2auWl2NUR0fA7JlKzKkKQvQryp98Cn7tgiYusyDeReaJyycCibDSOphh2HhLganiM2GRMorbr4tLNWtRKxlydHrEvXkRLQe30bCFYMfRB1/s1600/metroon_lock_screen.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;metroon lockscreen can control music&quot; border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsGGbyTtA94Wjiecv10tTM_Lw4-zKSmNOe9L2auWl2NUR0fA7JlKzKkKQvQryp98Cn7tgiYusyDeReaJyycCibDSOphh2HhLganiM2GRMorbr4tLNWtRKxlydHrEvXkRLQe30bCFYMfRB1/s320/metroon_lock_screen.jpg&quot; title=&quot;metroon lockscreen&quot; width=&quot;174&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;u&gt;Metroon Lockscreen with Control Music Playlist&lt;/u&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Launch Animations&lt;/b&gt;&lt;br /&gt;
The Windows 8 launch and close animations.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMexyrkfUu6ZDTQx0TCn0PW7OWLC-jOjPBKobqNiPLNi-D9SYgr8BD-EVsn-UWBzEkLMI5FBZbBsqLlX-Lh0RkrUqMOXqbcCVD_T7gW7w5zVBwn0t4Q6-hP0ibTa0X9rZCpQmlp-r0idC6/s1600/metroon_all_apps.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Metroon All Apps&quot; border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMexyrkfUu6ZDTQx0TCn0PW7OWLC-jOjPBKobqNiPLNi-D9SYgr8BD-EVsn-UWBzEkLMI5FBZbBsqLlX-Lh0RkrUqMOXqbcCVD_T7gW7w5zVBwn0t4Q6-hP0ibTa0X9rZCpQmlp-r0idC6/s320/metroon_all_apps.jpg&quot; title=&quot;Metroon All Apps&quot; width=&quot;174&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Metroon view All Apps&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Integrated Music Live Tile&lt;/b&gt;&lt;br /&gt;
A large music live tile that shows the album art, title and artist of the currently playing song. Pressing the &#39;smaller&#39; button will change the tile to only show the album artwork.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Integrated Calendar Live Tile&lt;/b&gt;&lt;br /&gt;
A large calendar tile that shows your latest appointment you have set in your local calendar app.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Integrated Messaging Live Tile&lt;/b&gt;&lt;br /&gt;
A large messaging tile that shows the latest message you received.&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9nOn5HmD55TGAjvE0PfQal2WiuTQC0QKjVvpHlrydLIAWoD_o7SMtthVvB4QlBpbTbHCL4_JlDZX5lilnPUuGySHpp2Z2eyBWjsbYlEzyYZIh1yi-VfJdisOP3An7nxAzgpIF7SDX3Bc4/s1600/metroon_change_accents.jpg&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img alt=&quot;Metroon Change Accents&quot; border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9nOn5HmD55TGAjvE0PfQal2WiuTQC0QKjVvpHlrydLIAWoD_o7SMtthVvB4QlBpbTbHCL4_JlDZX5lilnPUuGySHpp2Z2eyBWjsbYlEzyYZIh1yi-VfJdisOP3An7nxAzgpIF7SDX3Bc4/s320/metroon_change_accents.jpg&quot; title=&quot;Metroon Change Accents&quot; width=&quot;174&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;b&gt;Customization&lt;/b&gt;&lt;br /&gt;
This theme can (and should be) heavily customized. Things that can be customized:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; The tile&#39;s/app&#39;s name that is displayed&lt;/li&gt;
&lt;li&gt;The tile&#39;s badge position and size (both for small and large tiles)&lt;/li&gt;
&lt;li&gt;The tile image (both for small and large tiles)&lt;/li&gt;
&lt;li&gt;The tile image when it has a badge (both for small and large tiles)&lt;/li&gt;
&lt;li&gt;The username&amp;nbsp;&lt;/li&gt;
&lt;li&gt;The user icon&lt;/li&gt;
&lt;li&gt;The background&lt;/li&gt;
&lt;li&gt;Every background color &lt;/li&gt;
&lt;/ul&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6cYrTOj-D3R777nLDviBjkX-fMv0sunzrZwIKlB08ioUK63hL4fV4rZGLnw63-imzzG_8vmbpa1G2OhMh_ptY3KZHyClhKjfZdGNmCAlfx7bJ643ByiZFFkvDzS-KlwvA7DGCZDvLmwlt/s1600/metroon_change_username_and_lock_screen.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Metroon Lock the Screen&quot; border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6cYrTOj-D3R777nLDviBjkX-fMv0sunzrZwIKlB08ioUK63hL4fV4rZGLnw63-imzzG_8vmbpa1G2OhMh_ptY3KZHyClhKjfZdGNmCAlfx7bJ643ByiZFFkvDzS-KlwvA7DGCZDvLmwlt/s320/metroon_change_username_and_lock_screen.jpg&quot; title=&quot;Metroon Change Username&quot; width=&quot;174&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9nOn5HmD55TGAjvE0PfQal2WiuTQC0QKjVvpHlrydLIAWoD_o7SMtthVvB4QlBpbTbHCL4_JlDZX5lilnPUuGySHpp2Z2eyBWjsbYlEzyYZIh1yi-VfJdisOP3An7nxAzgpIF7SDX3Bc4/s1600/metroon_change_accents.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgplYP4NYNejO2JbcOQmnRKA08e_dop9zq4xo4j5H15-1nqv9eWcAEDcGRHdIeo7fHXE0JP3lrPXu5gusKJq7RCuyT_P7eFm3VP4rtYdJ3DH3x6bKucnWxvxFphkLymJgObNkKRpcViaqV5/s1600/metroon_change_backgrounds.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Metroon Change Backgrounds&quot; border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgplYP4NYNejO2JbcOQmnRKA08e_dop9zq4xo4j5H15-1nqv9eWcAEDcGRHdIeo7fHXE0JP3lrPXu5gusKJq7RCuyT_P7eFm3VP4rtYdJ3DH3x6bKucnWxvxFphkLymJgObNkKRpcViaqV5/s320/metroon_change_backgrounds.jpg&quot; title=&quot;Metroon Change Backgrounds&quot; width=&quot;174&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
There is a settings section from which you can choose the backgrounds and accent colors you made yourself. There is an unlimited number of slots, so you can have an infinite amount of wallpapers and colors stored that can easily be applied from within the theme.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe allowfullscreen=&#39;allowfullscreen&#39; webkitallowfullscreen=&#39;webkitallowfullscreen&#39; mozallowfullscreen=&#39;mozallowfullscreen&#39; width=&#39;320&#39; height=&#39;266&#39; src=&#39;https://www.youtube.com/embed/ApCKoUV6rHw?feature=player_embedded&#39; frameborder=&#39;0&#39;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Download&lt;/b&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://adf.ly/IscdH&quot; rel=&quot;nofollow&quot; onclick=&quot;javascript:_gag.push([&#39;_trackEvent&#39;,&#39;outbound-link&#39;,&#39;https://adf.ly/IscdH&#39;]);&quot;&gt;Metroon_1.1.2-1.deb&lt;/a&gt; (see &lt;a href=&quot;https://dityalovers.blogspot.com/2012/07/install-file-dengan-ekstensi-ipa-dan.html&quot;&gt;how to install .deb / debian file on iOS&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://adf.ly/It0T5&quot; rel=&quot;nofollow&quot; onclick=&quot;javascript:_gag.push([&#39;_trackEvent&#39;,&#39;outbound-link&#39;,&#39;https://adf.ly/It0T5&#39;]);&quot;&gt;Original Tile.zip&lt;/a&gt; (The tiles shown in the Windows 8 Consumer Preview and included in the Metroon download)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://adf.ly/It1fS&quot; rel=&quot;nofollow&quot; onclick=&quot;javascript:_gag.push([&#39;_trackEvent&#39;,&#39;outbound-link&#39;,&#39;https://adf.ly/It1fS&#39;]);&quot;&gt;ColorKeyboard Teal Theme&lt;/a&gt;&lt;b&gt;.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://adf.ly/It594&quot; rel=&quot;nofollow&quot; onclick=&quot;javascript:_gag.push([&#39;_trackEvent&#39;,&#39;outbound-link&#39;,&#39;https://adf.ly/It594&#39;]);&quot;&gt;Metroon_Live_People_tile.zip&lt;/a&gt;&lt;b&gt;.&amp;nbsp; &lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
Credit to &lt;span style=&quot;color: red;&quot;&gt;ModMyi&lt;/span&gt; forums :)&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/3200309562456447935/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2013/02/metroon-windows-8-dreamboard-theme.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/3200309562456447935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/3200309562456447935'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2013/02/metroon-windows-8-dreamboard-theme.html' title='Metroon Windows 8 Dreamboard Theme'/><author><name>Aditya Nursyahbani</name><uri>http://www.blogger.com/profile/07325213218049741746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTpoUrcVoSJHVanvhqCggtaov04yK6-3r_c3wRwWTa-ADRHKl5ZdFyYM_VXKVHST3BoEN5oUFsAjIXk9x_YbKEcc4eBdbd4JuWjCvPsWiZqs7NDDi9oXLU-mdIWFfTw/s220/SAM_1082.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDA7jOpR1wA7-XMBVmVddjKjEE9k_BPzSOmpq-nq5WSmjApn92L5AxzYTEuUgqouCwWgZs6bvGV3o0maf29G70eXoNcpi3ei9or8H5QrnzvMlaGysVzVKulpJUEbYMn1hg32EiOZa2Rcdk/s72-c/metroon.PNG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-4101111664585149342</id><published>2013-02-04T21:24:00.000+07:00</published><updated>2019-02-04T21:25:15.977+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="Jailbreak"/><title type='text'>Untethered Jailbreak iOS 6 with evasi0n</title><content type='html'>&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpCfPA37VYxdGyLrscbGslHn64L9ZPNcNa9OVXOJgsOkv3U3EMp7MDDnGtiU5dnKbsNsCPCtECcfwy4PccsDNqzLKtA4m3u9ZO2aJzul4tNcsovUcG-on45uQwhp2M0Kcedb_pbB6fmsDo/s1600/evad3rs.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;evasi0n&quot; border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpCfPA37VYxdGyLrscbGslHn64L9ZPNcNa9OVXOJgsOkv3U3EMp7MDDnGtiU5dnKbsNsCPCtECcfwy4PccsDNqzLKtA4m3u9ZO2aJzul4tNcsovUcG-on45uQwhp2M0Kcedb_pbB6fmsDo/s1600/evad3rs.png&quot; title=&quot;evasi0n by evad3rs&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;evasi0n&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Setelah lama ditunggu-tunggu, akhirnya iOS 6 rilis juga &lt;i&gt;Untethered Jailbreak&lt;/i&gt;-nya. Maksudnya &lt;i&gt;Untethered Jailbreak&lt;/i&gt;, klo iDevice kita mati abis batre / &lt;i&gt;reboot&lt;/i&gt; itu tidak memerlukan bantuan komputer untuk booting OS. Berkat perjuangan Evad3rs Team yang terdiri dari @pimskeks,&amp;nbsp;@planetbeing, @pod2g dan @MuscleNerd yang baru saja meluncurkan program bernama evasi0n. evasi0n merupakan sebuah program/&lt;i&gt;software&lt;/i&gt; yang dapat digunakan untuk menjailbreak iOS 6.1 (&lt;i&gt;Untethered&lt;/i&gt;), evasi0n juga dapat berjalan pada &lt;i&gt;multi platform&lt;/i&gt; OS (Linux, Windows and Mac OS X).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;Evasi0n supported devices :&lt;/b&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;iPhone 5&lt;/li&gt;
&lt;li&gt;iPhone 4S&lt;/li&gt;
&lt;li&gt;iPhone 4&lt;/li&gt;
&lt;li&gt;iPhone 3GS&lt;/li&gt;
&lt;li&gt;iPad 4&lt;/li&gt;
&lt;li&gt;iPad 3 (aka The New iPad)&lt;/li&gt;
&lt;li&gt;iPad 2&lt;/li&gt;
&lt;li&gt;iPad Mini&lt;/li&gt;
&lt;li&gt;iPod Touch 5&lt;/li&gt;
&lt;li&gt;iPod Touch 4&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Evasi0n iOS firmware supported :&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;iOS 6.0&lt;/li&gt;
&lt;li&gt;iOS 6.0.1&lt;/li&gt;
&lt;li&gt;iOS 6.0.2&lt;/li&gt;
&lt;li&gt;iOS 6.1&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;Sebelum melakukan jailbreak, perhatikan hal-hal berikut :&lt;/b&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Cek dulu kompabilitas (&lt;i&gt;Cydia Tweaks&lt;/i&gt;) khususnya bagi yang masih running iOS 5.1.1, apakah banyak yang kompatibel dengan iOS 6. Soalnya untuk iDevice yg menggunakan processor A5 keatas itu ga bisa downgrade meskipun kita memiliki SHSH &lt;i&gt;blobs&lt;/i&gt; Tapi klo iPhone 5 yang bawaan OSnya iOS 6, ga usah pake ragu :)&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;How-To :&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Backup device terlebih dahulu dengan menggunakan iTunes ataupun menggunakan iCloud untuk mencegah terjadinya kesalahan atau kehilangan / &lt;i&gt;data loss&lt;/i&gt; sebelum menggunakan evasi0n.&lt;/li&gt;
&lt;li&gt;Jika passcode device (&lt;i&gt;Lock Device&lt;/i&gt;) diaktifkan, matikan terlebih dahulu.&lt;/li&gt;
&lt;li&gt;Pada saat melakukan jailbreak menggunakan evasi0n, pastikan &lt;span style=&quot;color: red;&quot;&gt;&lt;i&gt;tidak menjalankan&lt;/i&gt;&lt;/span&gt; iTunes atau program-program lainnya yang dapat mengganggu / menghambat proses jailbreak.&lt;/li&gt;
&lt;li&gt;Jika &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Downloads :&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;evasi0n &lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://adf.ly/Ia0x1&quot; rel=&quot;nofollow&quot;&gt;evasi0n for Windows&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://adf.ly/Ia1Bo&quot; rel=&quot;nofollow&quot;&gt;evasi0n for Mac OS X (Macintosh)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://adf.ly/Ia1TN&quot; rel=&quot;nofollow&quot;&gt;evasi0n for Linux&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;iOS 6.1 Official Firmware (.ipsw)&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;iPhone 5 (&lt;a href=&quot;https://adf.ly/Ia24f&quot; rel=&quot;nofollow&quot;&gt;GSM&lt;/a&gt;, &lt;a href=&quot;https://adf.ly/Ia2di&quot; rel=&quot;nofollow&quot;&gt;CDMA&lt;/a&gt;)&lt;b&gt;&amp;nbsp;&lt;/b&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://adf.ly/Ia2nS&quot; rel=&quot;nofollow&quot;&gt;iPhone 4S&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;iPhone 4 (&lt;a href=&quot;https://adf.ly/Ia2tv&quot; rel=&quot;nofollow&quot;&gt;GSM&lt;/a&gt;, &lt;a href=&quot;https://adf.ly/Ia2yM&quot; rel=&quot;nofollow&quot;&gt;CDMA&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://adf.ly/Ia33w&quot; rel=&quot;nofollow&quot;&gt;iPhone 3GS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;iPad Mini (&lt;a href=&quot;https://adf.ly/Ia3Bz&quot; rel=&quot;nofollow&quot;&gt;GSM&lt;/a&gt;, &lt;a href=&quot;https://adf.ly/Ia3Gw&quot; rel=&quot;nofollow&quot;&gt;CDMA&lt;/a&gt;, &lt;a href=&quot;https://adf.ly/Ia3KO&quot; rel=&quot;nofollow&quot;&gt;Wi-Fi&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;iPad 4 (&lt;a href=&quot;https://adf.ly/Ia3t2&quot; rel=&quot;nofollow&quot;&gt;GSM&lt;/a&gt;, &lt;a href=&quot;https://adf.ly/Ia3wy&quot; rel=&quot;nofollow&quot;&gt;CDMA&lt;/a&gt;, &lt;a href=&quot;https://adf.ly/Ia41l&quot; rel=&quot;nofollow&quot;&gt;Wi-Fi&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;iPad 3 (&lt;a href=&quot;https://adf.ly/Ia47m&quot; rel=&quot;nofollow&quot;&gt;GSM&lt;/a&gt;, &lt;a href=&quot;https://adf.ly/Ia4CL&quot; rel=&quot;nofollow&quot;&gt;CDMA&lt;/a&gt;, &lt;a href=&quot;https://adf.ly/Ia4H7&quot; rel=&quot;nofollow&quot;&gt;Wi-Fi&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;iPad 2 (&lt;a href=&quot;https://adf.ly/Ia4Pj&quot; rel=&quot;nofollow&quot;&gt;GSM&lt;/a&gt;, &lt;a href=&quot;https://adf.ly/Ia4Zi&quot; rel=&quot;nofollow&quot;&gt;CDMA&lt;/a&gt;, &lt;a href=&quot;https://adf.ly/Ia4gd&quot; rel=&quot;nofollow&quot;&gt;Wi-Fi&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://adf.ly/Ia4kx&quot; rel=&quot;nofollow&quot;&gt;iPad 2 16Gb (new)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;iPod Touch (&lt;a href=&quot;https://adf.ly/Ia4p4&quot; rel=&quot;nofollow&quot;&gt;4th Generation&lt;/a&gt;, &lt;a href=&quot;https://adf.ly/Ia4ss&quot; rel=&quot;nofollow&quot;&gt;5th Generation&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/4101111664585149342/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2019/02/untethered-jailbreak-ios-6-with-evasi0n.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/4101111664585149342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/4101111664585149342'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2019/02/untethered-jailbreak-ios-6-with-evasi0n.html' title='Untethered Jailbreak iOS 6 with evasi0n'/><author><name>Aditya Nursyahbani</name><uri>http://www.blogger.com/profile/07325213218049741746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTpoUrcVoSJHVanvhqCggtaov04yK6-3r_c3wRwWTa-ADRHKl5ZdFyYM_VXKVHST3BoEN5oUFsAjIXk9x_YbKEcc4eBdbd4JuWjCvPsWiZqs7NDDi9oXLU-mdIWFfTw/s220/SAM_1082.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpCfPA37VYxdGyLrscbGslHn64L9ZPNcNa9OVXOJgsOkv3U3EMp7MDDnGtiU5dnKbsNsCPCtECcfwy4PccsDNqzLKtA4m3u9ZO2aJzul4tNcsovUcG-on45uQwhp2M0Kcedb_pbB6fmsDo/s72-c/evad3rs.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2988995652194087219.post-8592519825253041422</id><published>2012-10-08T07:52:00.002+07:00</published><updated>2019-02-04T21:15:23.312+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cydia"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="Jailbreak"/><title type='text'>Backup Cydia Package dengan AppToDeb</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVzy83LhespPLZy8XXi6L9ZkejHO6_GHPEUxFOB4IfbL_ckgdr95_om8YmNPnNLlxvkUQK8sf-e6CXercrC-LYWjYGZgZmRlckr1Q6kU1CdqK8GnPemJgztGuwCiq99z5op7zbjHibCLBP/s1600/apptodeb.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVzy83LhespPLZy8XXi6L9ZkejHO6_GHPEUxFOB4IfbL_ckgdr95_om8YmNPnNLlxvkUQK8sf-e6CXercrC-LYWjYGZgZmRlckr1Q6kU1CdqK8GnPemJgztGuwCiq99z5op7zbjHibCLBP/s1600/apptodeb.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;i&gt;AppToDeb&lt;/i&gt; merupakan tweak cydia (&lt;i&gt;Cydia Tweaks&lt;/i&gt;) yang dapat digunakan untuk konversi aplikasi-aplikasi yang telah diinstal dari Cydia menjadi file debian (&lt;i&gt;.deb&lt;/i&gt;). &lt;i&gt;AppToDeb&lt;/i&gt; juga dapat digunakan untuk membuat backup Cydia Package, jadi kita tidak perlu repot mencari aplikasi pada &lt;i&gt;repository&lt;/i&gt; Cydia dan menginstall kembali aplikasi / themes yang diinstal dari Cydia ketika ingin melakukan &lt;i&gt;upgrade iOS firmware. &lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Untuk melakukan &lt;i&gt;backup &lt;/i&gt;aplikasi &lt;i&gt;Cydia &lt;/i&gt;(&lt;i&gt;single application file backup&lt;/i&gt;) menjadi&lt;i&gt; &lt;/i&gt;file debian (&lt;i&gt;.deb&lt;/i&gt;) berikut langkah-langkahnya:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Buka Aplikasi AppToDeb&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-6ehchMuJrigVSh4zbho_pBEXBU6LaKr6TSVFtzcIODOX_HXpwUZ55MLs3rcvvpUD5uY2lsgp_ONFUS2IT-bZnUN6UnRotp2Xhx5XrRUvHZDY0Lp712eVYJR3eG3qmY0ZL4LExhmnThXk/s1600/apptodeb-1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;AppToDeb Cydia Tweaks&quot; border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-6ehchMuJrigVSh4zbho_pBEXBU6LaKr6TSVFtzcIODOX_HXpwUZ55MLs3rcvvpUD5uY2lsgp_ONFUS2IT-bZnUN6UnRotp2Xhx5XrRUvHZDY0Lp712eVYJR3eG3qmY0ZL4LExhmnThXk/s320/apptodeb-1.png&quot; title=&quot;AppToDeb Cydia Tweaks&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;AppToDeb Cydia Tweaks&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;Pilih dan Tap aplikasi yang ingin di backup.&lt;/li&gt;
&lt;li&gt;Tap menu &lt;i&gt;make deb&lt;/i&gt;.&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhbqjg-hOapmSl4iiqZbu2OHts1DGQ7y1ijWO2F2JPUIsarFz9DreyEgDveMtBWh5u2rgM5YHKOuTfyPM8d1rPszZwx71L0tgbGNYiOowq8qbnIyas9rJms9GyRRGOBCeDCQJH1K4HzGg6/s1600/apptodeb-2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Make debian file from AppToDeb&quot; border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhbqjg-hOapmSl4iiqZbu2OHts1DGQ7y1ijWO2F2JPUIsarFz9DreyEgDveMtBWh5u2rgM5YHKOuTfyPM8d1rPszZwx71L0tgbGNYiOowq8qbnIyas9rJms9GyRRGOBCeDCQJH1K4HzGg6/s320/apptodeb-2.png&quot; title=&quot;Make deb file from AppToDeb&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Make Deb File from AppToDeb&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;Hasil / outputnya adalah file debian (.deb) yang terletak pada direktori &lt;i&gt;/var/mobile/Library/AppToDeb/&lt;/i&gt; (&lt;i&gt;browse&lt;/i&gt; filenya menggunakan iFile dan simpan baik-baik)&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7qXjfpweE2Xjeg7nk9Mm1c0lSq0aZ1q33YSxUaSjUIU06s4pHhJ_Whr-2Yuyejudh8lsaCsgz-YopA0CamRd04sHaCXSazLJS6zyMY-DxiPej3s2L7b2q9n5oRfGwUhDQ8QEohb1ih9U7/s1600/apptodeb-4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;file .deb location on AppToDeb&quot; border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7qXjfpweE2Xjeg7nk9Mm1c0lSq0aZ1q33YSxUaSjUIU06s4pHhJ_Whr-2Yuyejudh8lsaCsgz-YopA0CamRd04sHaCXSazLJS6zyMY-DxiPej3s2L7b2q9n5oRfGwUhDQ8QEohb1ih9U7/s320/apptodeb-4.png&quot; title=&quot;file .deb location on AppToDeb&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Deb File Location&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
Selain digunakan untuk &lt;i&gt;backup&lt;/i&gt;, &lt;i&gt;AppToDeb&lt;/i&gt; juga dapat digunakan untuk modifikasi &lt;i&gt;file control debian &lt;/i&gt;(berguna jika ingin membuat repository cydia sendiri)&lt;i&gt;. &lt;/i&gt;Kita dapat mengetahui ketergantungan (&lt;i&gt;Depends&lt;/i&gt;) &lt;i&gt; file &lt;/i&gt;pada suatu aplikasi Cydia dan modifikasi metadata lainnya.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4kKjU4s0l0KohJolZ6u3NAkAmtYlZ4PGTWTRSQJIRHxy-iIaqowWyW1-Q2IZKtXxUCbtsAFJLJ1ulV6ZF_euLD8tfJ5Gf7FWYEn1Ju61QNl0fJ0w1MEZnlQ3wYB4RaSNcZhlfd4ByG8SW/s1600/apptodeb-3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Editing debian control AppToDeb&quot; border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4kKjU4s0l0KohJolZ6u3NAkAmtYlZ4PGTWTRSQJIRHxy-iIaqowWyW1-Q2IZKtXxUCbtsAFJLJ1ulV6ZF_euLD8tfJ5Gf7FWYEn1Ju61QNl0fJ0w1MEZnlQ3wYB4RaSNcZhlfd4ByG8SW/s320/apptodeb-3.png&quot; title=&quot;Editing Depends on AppToDeb&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Modifying debian control on AppToDeb&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Bagi yang belum tau atau masih bingung untuk install file debian (&lt;i&gt;.deb&lt;/i&gt;) di &lt;i&gt;iOS devices&lt;/i&gt;, silahkan kunjungi artikel  
&lt;a href=&quot;https://dityalovers.blogspot.com/2012/07/install-file-dengan-ekstensi-ipa-dan.html&quot;&gt;install file dengan ekstensi .ipa dan .deb&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Download AppToDeb :&lt;/b&gt; &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;via Cydia&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;insanelyi repo&lt;/li&gt;
&lt;li&gt;Gudhel Cydia Repository (alternate)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Buka Cydia, tap Manage, tap Source, tap Edit, tap Add, input Cydia/APT URL &lt;i&gt;&lt;a href=&quot;https://repo.aditya-nursyahbani.com/&quot; onclick=&quot;javascript:_gag.push([&#39;_trackEvent&#39;,&#39;outbound-link&#39;,&#39;https://repo.aditya-nursyahbani.com/&#39;]);&quot;&gt;https://repo.aditya-nursyahbani.com/&lt;/a&gt;, browse &lt;/i&gt;dan&lt;i&gt; install AppToDeb.&lt;/i&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;a href=&quot;https://adf.ly/DVJSB&quot; rel=&quot;nofollow&quot; onclick=&quot;javascript:_gag.push([&#39;_trackEvent&#39;,&#39;outbound-link&#39;,&#39;https://adf.ly/DVJSB&#39;]);&quot;&gt;AppToDeb.deb (&lt;i&gt;debian file&lt;/i&gt;)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;Aditya Nursyahbani&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dityalovers.blogspot.com/feeds/8592519825253041422/comments/default' title='Posting Komentar'/><link rel='replies' type='text/html' href='http://dityalovers.blogspot.com/2012/10/backup-cydia-package-dengan-apptodeb.html#comment-form' title='0 Komentar'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/8592519825253041422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2988995652194087219/posts/default/8592519825253041422'/><link rel='alternate' type='text/html' href='http://dityalovers.blogspot.com/2012/10/backup-cydia-package-dengan-apptodeb.html' title='Backup Cydia Package dengan AppToDeb'/><author><name>Aditya Nursyahbani</name><uri>http://www.blogger.com/profile/07325213218049741746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTpoUrcVoSJHVanvhqCggtaov04yK6-3r_c3wRwWTa-ADRHKl5ZdFyYM_VXKVHST3BoEN5oUFsAjIXk9x_YbKEcc4eBdbd4JuWjCvPsWiZqs7NDDi9oXLU-mdIWFfTw/s220/SAM_1082.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVzy83LhespPLZy8XXi6L9ZkejHO6_GHPEUxFOB4IfbL_ckgdr95_om8YmNPnNLlxvkUQK8sf-e6CXercrC-LYWjYGZgZmRlckr1Q6kU1CdqK8GnPemJgztGuwCiq99z5op7zbjHibCLBP/s72-c/apptodeb.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>